上篇文章注册中心选出了Consul 和 K8S,现在我需要把他们集成到SpringCloud里,体验一下他们的服务注册发现、动态配置与权限分配难易 问题,以便选出更适合我们的。
首先用Docker搭建出Consul集群,这一步忽略了,属于Docker的范畴,搭建完成之后,我们登录到Consul的控制台看下
![](/upload/otherpic11/bbb854bbfe91c55e267da453059f7e17.jpg)
![](/upload/otherpic11/bdcb87ed044a45520c0c0809dcc0fcf1.jpg)
我的项目结构是这种:
![](/upload/otherpic11/8ebc5631edd335cd7dfb996707b451da.jpg)
最外层pom:
4.0.0 org.springframework.boot spring-boot-starter-parent3.0.1 org.maple.consul maple-consul1.0-SNAPSHOT pom maple-order maple-member 17 17 2022.0.0 UTF-8 org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import org.springframework.boot spring-boot-starter-web
服务注册与发现
服务注册:
maple-order的pom为:
4.0.0 org.maple.consul maple-consul1.0-SNAPSHOT com.maple.order maple-order0.0.1-SNAPSHOT maple-order jar maple-order org.springframework.cloud spring-cloud-starter-consul-discoveryorg.springframework.boot spring-boot-starter-testtest org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-maven-plugin
maple-member的pom为:
4.0.0 org.maple.consul maple-consul1.0-SNAPSHOT com.maple.member maple-member0.0.1-SNAPSHOT maple-member jar maple-member org.springframework.cloud spring-cloud-starter-consul-discoveryorg.springframework.boot spring-boot-starter-testtest org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-maven-plugin
maple-order的 bootstrap.yml 为:
server:
port: 1001
management:
server:
port: 8001
consul:
host: localhost
port: 8500
spring:
application:
name: maple-order
cloud:
consul:
host: ${consul.host}
port: ${consul.port}
discovery:
service-name: ${spring.application.name}
heartbeat:
enabled: true
maple-member的 bootstrap.yml 为:
server:
port: 1101
management:
server:
port: 8001
consul:
host: localhost
port: 8500
spring:
application:
name: maple-member
cloud:
consul:
host: ${consul.host}
port: ${consul.port}
discovery:
service-name: ${spring.application.name}
heartbeat:
enabled: true
然后在每一个服务的Application里加上 @EnableDiscoveryClient 注解,分别启动应用之后,我们再打开Consul控制台看:
![](/upload/otherpic11/73480095e4aa10e780857d94f5882556.jpg)
服务已经注册成功了,接下来测试服务发现
服务发现
我们让 order服务暴露接口,member通过openFeign调用,order和member服务都在pom里引入openFeign的依赖:
org.springframework.cloud spring-cloud-starter-openfeign
并且在消费者 member 的Application里新增 @EnableFeignClients 注解
![](/upload/otherpic11/0907affdd80516c16e5a9db2d2290ec1.jpg)
我们在order中暴露接口,并完成接口实现
![](/upload/otherpic11/9126385d3225abfd1b2866fc3e0858ad.jpg)
![](/upload/otherpic11/4e82963afe1b259d0b30ce567e94d273.jpg)
在member中集成order的这个接口
![](/upload/otherpic11/beb5bf1734c419fd5b104c7df4c2bfbf.jpg)
member的controller暴露web接口测试
![](/upload/otherpic11/0eba9988ef49bc9c4ca723259c281aaa.jpg)
![](/upload/otherpic11/3000a7b5cc1c569781a6548dcb07d7e7.jpg)
服务间调用成功,我们再启动多一个服务,保持两个consume和两个provide,然后再shutdown 某个provide观察接口的调用情况,为了方便观察我们打点日志。
我们在启动第二个order服务的时候,手动加个端口即可
![](/upload/otherpic11/dd20738ee1702782879295c359ee08d4.jpg)
member也是一样的操作,都启动完成之后我们看下Consul控制台
![](/upload/otherpic11/508f4f57e69631c8a48bda66f5a04352.jpg)
![](/upload/otherpic11/87e32382108f5db3310a1e200e3155e3.jpg)
然后我再访问 http://localhost:1101/user/queryOrder 让用户1调订单服务,我访问了10次,发现每个order服务分别访问了5次,轮询来访问的,当然这应该是openFeign里面的负载均衡的策略,访问另外一个member服务也是一样的效果 http://localhost:1102/user/queryOrder
![](/upload/otherpic11/4f96cecf72b7c9e1a8672615ab81dd91.jpg)
![](/upload/otherpic11/aa8963dff2af0efd699beddc1e99dbb4.jpg)
![](/upload/otherpic11/eb1655aff4625d2454b00e81fd9cf5ac.jpg)
下面我们把order2服务给下线,再重复上面的测试,那所有的请求都会打到order1服务,也可以正常提供能力,这里提一点Consul是没有雪崩保护的。
动态配置
Consul也可用做配置中心,
![](/upload/otherpic11/43060d9610949c496bcfe91d79a219b0.jpg)
我们通过create按钮来为order服务创建配置,为了模拟正常项目,我们创建开发和生产两个环境
config/maple-order::dev/data
config/maple-order::dev/data
:: 这个是profile 的隔离符合,默认是用英文逗号 , 。
最后的data是dataKey,因为配置文件内容支持多种格式,习惯原因我用的YAML格式,YAML格式就必须得加 dataKey,默认是 data,建完之后效果是这样的:
![](/upload/otherpic11/611cc108e889ed5be359a039181f8415.jpg)
dev里:
![](/upload/otherpic11/cf0c580fa3ffdf484d235be9de7dc711.jpg)
进去data里:
![](/upload/otherpic11/520f13715924d2ca6c67901b3eaa9d07.jpg)
prod里:
![](/upload/otherpic11/653b3a8f9c4b60ea2fb68c1b179c370c.jpg)
Consul控制台里配置的K-V存储完成了,我们把order的pom引入config的依赖
org.springframework.cloud spring-cloud-starter-consul-config org.springframework.cloud spring-cloud-starter-bootstrap
我们再去修改应用的 bootstrap.yml 文件
![](/upload/otherpic11/b810d715f938c91159757b0b8478793f.jpg)
关于config里的属性配置可以点进源码里看,为了默认值的我都没有再重复给了,这里我激活的profile为 prod,在order的程序里获取所配置的redis的ip。
![](/upload/otherpic11/bd0abf6b52a92982426a841992974f1a.jpg)
![](/upload/otherpic11/00d39eef77e2639980e8a1925e22c606.jpg)
测试发现获取到的配置是prod,ip为 666666
![](/upload/otherpic11/3aebcb7ebd4ad2551427b1b9cee3638d.jpg)
接下来我们在Consul控制台里把 666666 改为 999999,直接刷新浏览器看结果:
![](/upload/otherpic11/77d1857f5e0af235a20c6bf2ae422e9f.jpg)
直接就更新了,同时在idea控制台里也能发现这段日志,是一个TaskScheduler来帮我们做动态刷新的
![](/upload/otherpic11/932ac34144bf8bfefb8b17d93b440290.jpg)
平时项目中我们还会直接使用@Value注解获取配置,我们改下代码重启下
![](/upload/otherpic11/2819ab716db0add36e02eea5a765d322.jpg)
![](/upload/otherpic11/0e0c5f9ed97a951f279d684f40ffe193.jpg)
同样方法修改为 666666 再刷新浏览器,发现值没变,还是 999999...不用担心,我们加个 @RefreshScope 就能解决
![](/upload/otherpic11/0373f5898b7f8ffe9465491bf0bf0fae.jpg)
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
标题名称:SpringCloudConsul-创新互联
链接地址:http://tyjierui.cn/article/dshcpg.html