microk8s处理微服务之间的调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了microk8s处理微服务之间的调用相关的知识,希望对你有一定的参考价值。

参考技术A 通过在 microk8s上部署授权服务 ,我们基本上走通了微服务通过配置中心服务(config-central)加载配置并启自己的流程。

在microk8s上部署微服务,现在仅剩下一个需要处理的问题,微服务之间通的互相调用。这里我们用我们微服务集群里的base-service 和 diagnose-service来尝试整个流程。

base服务主要提供平台的基础数据,像配置授权服务一样,我们需要写configmap、deployment、service三个yaml配置文件。

整体上与授权服务没多大区别,但又两个地方这次需要特别注意:

1. 标黄的context-path的配置, springboot2.0 需要使用:

   server.servlet.context-path= xxxx  

   如果仍沿用1.0的配置, 启动时contexnt将为‘’。

2.  必须正确配置virtualHostName, 这个参数配置,会导致ribbion找不到base服务, 我就因为填写错误,被整了一两天,后来在介绍Ribbon原理的一篇文章里,发现:

 DiscoveryEnabledNIWSServerList

 从eureka服务获取服务列表,服务集群必须由VipAddress标识

Base服务的Deployment文件,没有什么特别的,和Authorize基本一样:

Service文件,我们仍旧定义为Nodeport方便测试:

部署完成后,我们使用port-forward 命令做个端口映射。

microk8s kubectl port-forward pod/baseservice-79946b574d-kqf8x 8000:9043

通过浏览器访问localhost:8000端口,就可以访问服务了。

部署完base服务,我们来看看怎么让diagnose服务调用base服务。

1. 需要在diagnose服务的入口,声明@enableEurekaClient 和 @enableFeignClients

2. 建立feign的接口文件

Name 是我们需要需要调用的微服务名,这个名字一定要注意:

1. 都使用小写, 因为k8s对服务名有要求。

2.  这个一定对应的是相应服务的virtualHostName, 否者找不着。

当然需要加载相应的cloud包,最好通过springboot提供的工具生成。

现在需要来写配置文件configmap,这个配置文件与base服务差不多,唯一区别就是标黄的

部分, 确保自动获取打开,另外使用主动加在服务。

通过上面的配置,我们在启动服务就可以看到,baseservice将被从注册中心获取并房子啊serverlist里。

Deployment和service的书写与base服务没有任何区别,这里就省略了。完成部署后,我们通过postman做测试,可以正确返回结果。

Notes: diagnose服务的conext因为没有正确配置,所以IP和端口后直接接了restful请求路径了,这个需要注意。

检查base服务,可以看到,确实调用了接口。

至此,服务间的调用初步走通了,现在我们还需要做一件事,就是将base服务在注册中心注册的IP改为k8s中的服务名称,只需要在configmap中增加如下属性:eureka.instance.ip-address= baseservice

然后,更新配置文件和deployment文件,重启服务。查看base服务注册中的记录,可以看到hostname和ipaddr已经正确显示服务名称。

重新通过postman调用diagnose服务发现,报错,调用base服务没响应。只好重启diagonose服务,查看日志:

启动后,服务列表已经正确填充了base服务:baseservice:9043

现在重新测试接口,正常返回结果。看来需要正确的设置,feign得自动刷新参数,否则发生服务名变化后,本地缓存不能及时清理,会导致无法正常工作。

走到这里,基本上在microk8s上部署服务,并实现服务间的调用就完成了。在整个验证过程中,深深地体会了,spring cloud的不好用:虽然看起来简单,但 一不小心就可能配置错误, 而且很多功能其实k8s已经提供,完全可以掠过。 k8s中的服务,已经提供了loadbalance的作用, feign的使用其实已经没有意义。

所以,虽然将旧的虚拟机环境的微服务迁移到k8s上,基本是走通了。但是我们还需要做的更进一步,剔除springcloud的功能。

这样,让开发工程师,从繁杂的配置中解脱出来,完全可以增减团队效率。

以上是关于microk8s处理微服务之间的调用的主要内容,如果未能解决你的问题,请参考以下文章

微服务之间相互调用方法

微服务如何实现各个模块之间相互调用

spring cloud各个微服务之间如何相互调用(FeignFeign带token访问服务接口)

布道微服务_06微服务调用的监控

spring cloud实战与思考 微服务之间通过fiegn上传一组文件(下)

在微服务之间传递用户身份和授权