Consul简介
Consul是一个开源的服务发现和配置管理工具,具有跨平台、运行高效等特点。它由HashiCorp公司开发,并使用Go语言编写。Consul主要用于实现分布式系统中的服务发现、健康检查、键值存储等功能。
核心功能
- 服务发现:Consul通过DNS或HTTP接口实现服务发现,允许开发人员轻松地注册、发现和注销服务,从而实现高可用和负载均衡。
- 健康检查:Consul具备强大的健康检查功能,可以监控服务的状态并根据设定的规则自动剔除故障节点。它支持多种健康检查方式,如TCP、HTTP、Docker容器等,确保服务的稳定性和可用性。
- 分布式一致性:Consul使用Raft算法作为其分布式一致性协议,确保在分布式环境下数据的一致性和可靠性。它实现了强一致性模型,能够处理网络分区、故障恢复等场景,保证系统的可靠性。
- 键值存储:Consul提供了一个简单但功能强大的键值存储接口,开发人员可以使用这个接口来存储和检索配置数据、共享状态信息等。它支持事务操作和ACL权限控制,为分布式系统的配置管理提供了便利。
使用HomeBrew安装Consl
根据系统不同会有不同的安装方法,笔者是在macos下进行的的安装,所以安装方法如下,Consl软件可从地址: Consl软件包下载 下载。
安装
brew tap hashicorp/tap
brew install hashicorp/tap/consul
运行
consul --version
consul agent -dev
访问
打开网址 : http://localhost:8500
涉及的模块
- springcloud-consul-server, provider服务提供者, 端口号:18093,18094
- springcloud-consul-client, consumer服务消费者, 端口号:18093
springcloud-consul-server 服务provider模块
pom.xml
依赖版本可参考 springbootSeries 模块中pom.xml文件中的版本定义
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
application.properties配置
spring.profiles.active = dev
spring.application.name=springbootConsulServer
server.port=18093
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}
spring.cloud.consul.discovery.service-name
值为在Consl中显示的服务标识名称,全局唯一。
application-server2.properties配置
实现另一个模块配置,实现集群效果。
#springboot Server
spring.application.name=springbootConsulServer
spring.aop.auto=true
spring.aop.proxy-target-class=true
# log4j
logging.config=classpath:log4j2.xml
logging.level.root=INFO
logging.level.org.springframework.web=ERROR
#restful Server
server.port=18094
server.compression.enabled=true
server.compression.mime-types=application/json,application/octet-stream
#swagger
springdoc.api-docs.enabled=true
springdoc.api-docs.path=/api-schema
swagger-config.group = default-group
swagger-config.description= The following is a restful-api list of {} application, and you can browse or test them to determine if they are working as you expect.
swagger-config.version=V1.0
swagger-config.urlPattern=/**
swagger-config.base-package=com.korgs
swagger-config.authorization-key-name=token
swagger-config.wiki = https://korgs.blog.csdn.net/
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}
spring.cloud.consul.discovery.service-name
值为在Consl中显示的服务标识名称,全局唯一。
SpringbootApplication启动类
添加 @EnableDiscoveryClient
注解
@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs", "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@EnableDiscoveryClient
public class SpringbootConsulServerApplication {
@Value("${server.port}")
private String serverPort;
public static void main(String[] args) {
SpringApplication.run(SpringbootConsulServerApplication.class, args);
}
@GetMapping("/helloworld")
public BaseResponse helloWorld(){
log.info(LogGenerator.trackLog()
+ "msg="+ "I am busy to handle this request."
+ "port=" + serverPort
);
return BaseResponse.success("hello world:" + serverPort);
}
}
springcloud-consul-client 服务Consumer 模块
pom.xml
依赖版本可参考 springbootSeries 模块中pom.xml文件中的版本定义
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
application.properties配置
service-url.ribbon-service= springbootConsulServer
名称为provider注册到consul上面的服务名称。
spring.profiles.active = dev
spring.application.name=springbootConsulClient
server.port=18095
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}
#自定义配置服务端
service-url.ribbon-service = http://springbootConsulServer
SpringbootApplication启动类
@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs", "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@EnableDiscoveryClient
public class SpringbootConsulClientRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootConsulClientRibbonApplication.class, args);
}
@GetMapping("/helloworld")
public BaseResponse helloWorld(){
log.info( LogGenerator.trackLog()
+ "msg=" + "I am busy to handle this request.");
return BaseResponse.success("hello world");
}
}
RestTemplate Bean 实现
注意添加@LoadBalanced
注解,这个是负载均衡实现的关键,代码如下:
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
测试Controller实现
@Value("${service-url.ribbon-service}")
指向application.properties
中的配置
@RestController
@RequestMapping("/api/load")
public class LoadBalanceController {
@Autowired
private RestTemplate restTemplate;
@Value("${service-url.ribbon-service}")
private String ribbonServiceUrl;
@GetMapping("/v1/hello-content")
public BaseResponse<String> loadHelloContent(String uuid){
String result = restTemplate.getForObject(ribbonServiceUrl + "/helloworld", String.class, uuid);
return BaseResponse.success(result);
}
}
源码下载
涉及模块:
- springcloud-consul-server, provider服务提供者, 端口号:18093,18094
- springcloud-consul-client, consumer服务消费者, 端口号:18093
源码下载:
- 基础框架源码下载
- Springboot集成Netflix-ribbon、Consul实现负载均衡调用
源码运行方法:
- 模块详细功能说明和运行测试方法
springcloud-consul-server ,分别用18093,18094启动
测试界面如下,可观察后台日志,也可查看返回结构的端口号。