microk8s上改造微服务对spring cloud的依赖
通过前面几个主题,我们基本上能够在k8s环境上运行所有的微服务,且不需要项目的修改。
但是在使用的过程中,需要搭建注册中心、配置中心。每个项目都需要通过注册中心来发现服务,服务间调用也不例外。 而这些目前来说却是由很多的弊端:
1. 以来spring cloud组建过多, 配置很多, 迁移过程的一个属性错误都会浪费大量的时间排查; 很明显,这样会降低研发工程师的产出。
2. k8s 环境里已经提供了,基于dns的服务发现, configmap和secret的配置;这个配置都不需要跟项目混合在一起。所以,注册中心与配置中心意义就不打了。特别是注册中心。
3. 对于新手来说,通过springcloud来做服务熔断,经常会与道不期望的问题,且无法只管的监控。这一部分增加了开发的负担,无法专心到业务上。 而k8s上有现成的istio 服务熔断服务,完全可以不再项目中包含任何相关代码。
总之, spring cloud 在微服务的生态里是重要组成,但在k8s中,就真的显得臃肿和多余。 所以,接下来我们将探讨怎么改造所有项目对springcloud的依赖,且尽可能做到不需要修改项目代码的情况。
1. 注册中心
注册中心的作用就是服务注册和发现, 注册是为了发现。而发现的方式就是通过openfeign 主动从注册中心获取服务实例。
在k8s中, 其实,在给每个微服务创建service的时候,已经相当于注册了。创建的service的微服务实例可以使用 [service-name].[namespace] :[端口号]来直接访问服务,k8s中的dns服务会正确的在网络层路由到实例, 并且具有Loadbalance的功能。
也就是说, k8s环境下, openfeign不需要通过eureka获取服务列表的这一部。我们只需要相关的机制,将代码中依赖的服务, 也就是
@FeignClient(name ="xxxxx")
映射到k8s中的服务,就可以了。
2. 配置中心
配置中心的作用就是集中管理配置, 这个k8s中的configmap和secret就可以做到,只需要将这些文件使用git管理起来。
当然也可以在整个家在过程中使用configmap + 配置中心(数据库版)的方案,部分devOpt更习惯, 但是有些多余。
3. 负载均衡问题
springcloud的负载均衡是有ribbon来实现的, springboot程序先获得serverlist, 然后再按照配置的算法,进行复杂。
k8s中是通过service +pod的方式实现的, 在网络底层进行负载, 我觉得性能肯定是超过项目代码方式的软负载的。 所以,使用ribbion进行负载仅仅在需要特殊自定义负载算法的时候有用,这时候可以考虑spring cloud k8s项目。
4. 服务熔断和流量监控
这个我觉得还是有k8s底层的istio插件提供比较方便,其可以和其他项目实现界面显示流量监控。
所以归结起来,我们要做的事情:
1. 移除注册中心服务,配置中心服务
2. 改造openfeign: 关闭服务发现,负载均衡,服务熔断。
为什么还要它呢? 一是减少代码修改, 而是openfeign调用外部服务的方式很方便,感觉比restfultemplate让人看着舒服。
现在我们看看怎么用配置文件的方式,修改openfeign.
1. 关闭 Hystrix, 去除线路熔断功能
# To disable Hystrix in Feign
feign:
hystrix:
enabled: false
2. 关闭服在均衡
直接使用用URL + 参数, 但这种方式需要代码,
3. 关闭eureka自动发现
ribbon.eureka.enabled= false
[rbclient].listOfServers=[service name]:[port]
4. 关闭eureka的注册
eureka.client.enabled=false 不启用eureka客户端。
按照以上的方案,现在再来修改服务间调用文中提到的基础服务:
configmap将包含所有非安全信息的配置项,移除对配置中心的需要, 与之前的configmap比较,我们:
1. 增加了从配置中心移除来的配置参数
2. 关闭掉eureka
3. 注释掉srping cloud配置
服务正常启动,但是发现还是有在获取配置中心的步骤。
增加 spring.cloud.config.eanbled=false 就可以去掉了。
重复microk8s处理微服务之间的调用中队base服务的测试,一切工作正常。整个修改只在配置层面进行,没有修改任何项目代码。
接着我们来看看diagnose服务对base服务的调用,同样我们需要先修改configmap文件:
对diagnose的configmap文件的修改除了增加来自注册中心的属性外,主要在springcloud的配置修改,关闭所有相关功能,并让Fegin能够找到对应的服务。
如上图所示, 我们也关闭了eureka客户端,config客户端。同时设置Ribbion不在使用eureka; 为了减少不必要的请求熔断,我们同时也关闭了hystrix.
最后,下一行是关键:
baseservice.ribbon.listOfServers=baseservice:9043
这里我们对应声明的代码中的feignclient:
@FeignClient(name = "baseservice")
结果也正常返回, 至此,我们达到了目的:
1. 通过配置移除了eureka, cloudconfig. 关闭里ribbon对eureka的使用,以及hystrix.
2. 通过配置,不再修改源码的情况下,我们仍旧让Feign能够正确找到服务。
并且服务是通过k8s的service配置,可以直接使用dns格式表示。
3. 这个项目,不需要对源码修改,不需要开发工程师参与,也就是说可以同时在k8s于普通虚拟机环境工作。
-----------------------------------------
Notes: 所有环境都迁入k8s后, 其实仍旧需要工程师去除@enablexxxx的注释,和build.gradle里的相应以来。这里我觉得是已经没什么问题。