spring cloud篇-(使用consul作为注册中心和配置中心)
使用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
spring:
application:
name: product
cloud:
consul:
host: 192.168.101.180 #这里是consul服务端的地址
port: 80 #这是consul服务端的端口
discovery:
health-check-timeout: 10s #检测超时时间
health-check-critical-timeout: 30s #设置超时30秒之后,注销服务,这里数字要大于心跳检测的数字
heartbeat:
enabled: true
ttl-value: 10 #这里开启心跳检测,设置10s提交一次心跳,用于consul与服务不在同一个网段的情况,支持存活检测,由于是启动10秒之后提交心跳,同时我这里consul和服务不在同一个网段,所以在项目启动成功之后,在consul上面需要等待十秒之后才能看到检测成功
prefer-ip-address: true
instance-group: default #设置实例所在组
server:
port: 9900
2.创建controller,添加一个接口,用于consumer调用
package com.lhstack.consul.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** * @author lhstack */
@RestController
@RequestMapping
public class ProductController {
@Autowired
private ServerProperties serverProperties;
/** * 打印product的服务端的端口 * @return */
@GetMapping
public int getPort() {
return serverProperties.getPort();
}
}
3.启动product项目,查看consul上面注册情况
启动之后这个异常先不用管,这应该是一个bug,但是不影响心跳提交
服务注册成功如下
启动consumer,调用product服务
1.在consumer项目添加application.yml文件,并添加如下配置
application.yml
spring:
application:
name: consumer
cloud:
consul:
host: 192.168.101.180 #这里是consul服务端的地址
port: 80 #这是consul服务端的端口
discovery:
health-check-timeout: 10s #检测超时时间
health-check-critical-timeout: 30s #设置超时30秒之后,注销服务,这里数字要大于心跳检测的数字
heartbeat:
enabled: true
ttl-value: 10 #这里开启心跳检测,设置10s提交一次心跳,用于consul与服务不在同一个网段的情况,支持存活检测,由于是启动10秒之后提交心跳,同时我这里consul和服务不在同一个网段,所以在项目启动成功之后,在consul上面需要等待十秒之后才能看到检测成功
prefer-ip-address: true
instance-group: default #与product必须属于同一个组
server:
port: 8080
2.创建controller,调用product服务提供的接口
ConsumerController.java
package com.lhstack.consul.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/** * @author lhstack */
@RequestMapping
@RestController
public class ConsumerController {
/** * 注入负载均衡客户端 */
@Autowired
private LoadBalancerClient loadBalancerClient;
/** * 构建http客户端 */
public RestTemplate restTemplate = new RestTemplate();
/** * 调用product服务接口 * @return */
@GetMapping
public Integer getPort(){
ServiceInstance product = loadBalancerClient.choose("product");
return restTemplate.getForObject(product.getUri().toString(),Integer.class);
}
}
3.启动类上面添加@EnableDiscoveryClient注解,标识需要开启服务发现
4.启动项目,在consul上面查看注册情况
同样,这个异常也不用管
5.使用浏览器访问consumer的接口,成功调用了product服务暴露的接口
6.再启动一个product服务,测试负载均衡情况
这里选择允许并行启动
修改端口
多请求几次,测试负载均衡
使用consul作为配置中心
在product和consumer项目的pom文件里面添加config依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
在product和consumer添加bootstrap.yml
product配置如下,并且删除之前的application.yml文件
spring:
application:
name: product
cloud:
consul:
config:
format: yaml
prefix: config #配置前缀
default-context: application #默认全局配置
profile-separator: "-" #配置文件名称和环境的连接符,这里修改为- ,例如 ${spring.application.name}-${spring.profiles.active}
data-key: data #这是config的数据key
host: 192.168.101.180
port: 80
profiles:
active: dev
consumer配置如下
spring:
application:
name: consumer
cloud:
consul:
config:
format: yaml
prefix: config #配置前缀
default-context: application #默认全局配置
profile-separator: "-" #配置文件名称和环境的连接符,这里修改为- ,例如 ${spring.application.name}-${spring.profiles.active}
data-key: data #这是config的数据key
host: 192.168.101.180
port: 80
profiles:
active: dev
consul配置如下格式
因为配置格式选的yaml格式,所以内容也是yaml格式
通用配置
product配置
“-“为${spring.cloud.consul.config.profile-separator}
consumer配置
启动项目
product加载配置成功了
服务也注册成功
consumer加载配置成功
服务注册成功
服务调用情况
配置动态更新
在product项目的controller上面加上RefreshScoe注解,如下
修改配置,将端口修改为9990
控制台也打印出来配置修改成功
使用consumer调用,配置也正确更新,如果出现服务调用失败情况,请等待一会儿,等consul缓存更新,就能拉取到正确的服务列表
还没有评论,来说两句吧...