spring cloud篇-(使用consul作为注册中心和配置中心)

Dear 丶 2023-01-16 06:56 226阅读 0赞

使用zookeeper作为注册中心和配置中心

  • consul安装
  • 初始化项目
    • 构建product
    • 构建consumer
  • 启动服务
    • 启动product
    • 启动consumer,调用product服务
  • 使用consul作为配置中心
    • 在product和consumer项目的pom文件里面添加config依赖
    • 在product和consumer添加bootstrap.yml
    • consul配置如下格式
    • 启动项目
    • 配置动态更新

consul安装

这里根据我之前一篇关于consul集群搭建的博客安装的
博客地址如下: docker篇-(docker-compose搭建consul高可用主从集群)

初始化项目

项目分为product和consumer两个项目,来演示微服务直接服务通讯,同时这里构建项目使用的spring boot版本为2.3.10
项目使用Spring Initializr构建
在这里插入图片描述

构建product

点击next
在这里插入图片描述
服务提供者,我们选择两个组件,点击next
在这里插入图片描述
点击finish
在这里插入图片描述

构建consumer

点击next
在这里插入图片描述
这里因为要调用product暴露的服务,所以选择ribbon做负载均衡,点击next
在这里插入图片描述
点击finish
在这里插入图片描述

启动服务

启动product

1.在product项目里面添加application.yml,并加入如下配置
在这里插入图片描述

application.yml

  1. spring:
  2. application:
  3. name: product
  4. cloud:
  5. consul:
  6. host: 192.168.101.180 #这里是consul服务端的地址
  7. port: 80 #这是consul服务端的端口
  8. discovery:
  9. health-check-timeout: 10s #检测超时时间
  10. health-check-critical-timeout: 30s #设置超时30秒之后,注销服务,这里数字要大于心跳检测的数字
  11. heartbeat:
  12. enabled: true
  13. ttl-value: 10 #这里开启心跳检测,设置10s提交一次心跳,用于consul与服务不在同一个网段的情况,支持存活检测,由于是启动10秒之后提交心跳,同时我这里consul和服务不在同一个网段,所以在项目启动成功之后,在consul上面需要等待十秒之后才能看到检测成功
  14. prefer-ip-address: true
  15. instance-group: default #设置实例所在组
  16. server:
  17. port: 9900

2.创建controller,添加一个接口,用于consumer调用
在这里插入图片描述

  1. package com.lhstack.consul.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.autoconfigure.web.ServerProperties;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. /** * @author lhstack */
  8. @RestController
  9. @RequestMapping
  10. public class ProductController {
  11. @Autowired
  12. private ServerProperties serverProperties;
  13. /** * 打印product的服务端的端口 * @return */
  14. @GetMapping
  15. public int getPort() {
  16. return serverProperties.getPort();
  17. }
  18. }

3.启动product项目,查看consul上面注册情况
启动之后这个异常先不用管,这应该是一个bug,但是不影响心跳提交
在这里插入图片描述
服务注册成功如下
在这里插入图片描述

启动consumer,调用product服务

1.在consumer项目添加application.yml文件,并添加如下配置
在这里插入图片描述
application.yml

  1. spring:
  2. application:
  3. name: consumer
  4. cloud:
  5. consul:
  6. host: 192.168.101.180 #这里是consul服务端的地址
  7. port: 80 #这是consul服务端的端口
  8. discovery:
  9. health-check-timeout: 10s #检测超时时间
  10. health-check-critical-timeout: 30s #设置超时30秒之后,注销服务,这里数字要大于心跳检测的数字
  11. heartbeat:
  12. enabled: true
  13. ttl-value: 10 #这里开启心跳检测,设置10s提交一次心跳,用于consul与服务不在同一个网段的情况,支持存活检测,由于是启动10秒之后提交心跳,同时我这里consul和服务不在同一个网段,所以在项目启动成功之后,在consul上面需要等待十秒之后才能看到检测成功
  14. prefer-ip-address: true
  15. instance-group: default #与product必须属于同一个组
  16. server:
  17. port: 8080

2.创建controller,调用product服务提供的接口
在这里插入图片描述

ConsumerController.java

  1. package com.lhstack.consul.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.cloud.client.ServiceInstance;
  4. import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9. /** * @author lhstack */
  10. @RequestMapping
  11. @RestController
  12. public class ConsumerController {
  13. /** * 注入负载均衡客户端 */
  14. @Autowired
  15. private LoadBalancerClient loadBalancerClient;
  16. /** * 构建http客户端 */
  17. public RestTemplate restTemplate = new RestTemplate();
  18. /** * 调用product服务接口 * @return */
  19. @GetMapping
  20. public Integer getPort(){
  21. ServiceInstance product = loadBalancerClient.choose("product");
  22. return restTemplate.getForObject(product.getUri().toString(),Integer.class);
  23. }
  24. }

3.启动类上面添加@EnableDiscoveryClient注解,标识需要开启服务发现
在这里插入图片描述
4.启动项目,在consul上面查看注册情况
同样,这个异常也不用管
在这里插入图片描述

在这里插入图片描述
5.使用浏览器访问consumer的接口,成功调用了product服务暴露的接口
在这里插入图片描述
6.再启动一个product服务,测试负载均衡情况
这里选择允许并行启动
在这里插入图片描述
修改端口
在这里插入图片描述
多请求几次,测试负载均衡
在这里插入图片描述
在这里插入图片描述

使用consul作为配置中心

在product和consumer项目的pom文件里面添加config依赖

在这里插入图片描述

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-consul-config</artifactId>
  4. </dependency>

在product和consumer添加bootstrap.yml

product配置如下,并且删除之前的application.yml文件
在这里插入图片描述

  1. spring:
  2. application:
  3. name: product
  4. cloud:
  5. consul:
  6. config:
  7. format: yaml
  8. prefix: config #配置前缀
  9. default-context: application #默认全局配置
  10. profile-separator: "-" #配置文件名称和环境的连接符,这里修改为- ,例如 ${spring.application.name}-${spring.profiles.active}
  11. data-key: data #这是config的数据key
  12. host: 192.168.101.180
  13. port: 80
  14. profiles:
  15. active: dev

consumer配置如下
在这里插入图片描述

  1. spring:
  2. application:
  3. name: consumer
  4. cloud:
  5. consul:
  6. config:
  7. format: yaml
  8. prefix: config #配置前缀
  9. default-context: application #默认全局配置
  10. profile-separator: "-" #配置文件名称和环境的连接符,这里修改为- ,例如 ${spring.application.name}-${spring.profiles.active}
  11. data-key: data #这是config的数据key
  12. host: 192.168.101.180
  13. port: 80
  14. profiles:
  15. active: dev

consul配置如下格式

因为配置格式选的yaml格式,所以内容也是yaml格式
通用配置
在这里插入图片描述
product配置
“-“为${spring.cloud.consul.config.profile-separator}
在这里插入图片描述
consumer配置
在这里插入图片描述

启动项目

product加载配置成功了
在这里插入图片描述
服务也注册成功
在这里插入图片描述
consumer加载配置成功
在这里插入图片描述
服务注册成功
在这里插入图片描述
服务调用情况
在这里插入图片描述

配置动态更新

在product项目的controller上面加上RefreshScoe注解,如下
在这里插入图片描述
修改配置,将端口修改为9990
在这里插入图片描述
控制台也打印出来配置修改成功
在这里插入图片描述
使用consumer调用,配置也正确更新,如果出现服务调用失败情况,请等待一会儿,等consul缓存更新,就能拉取到正确的服务列表
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,226人围观)

还没有评论,来说两句吧...

相关阅读

    相关 consul作为配置

      Conusl可以作为注册中心,也可以作为配置中心。 作为配置中心,使用起来也很方便,大多数都是配置。 Consul的安装这里不说了,主要是说明java后端怎么使用,所