搭建 Spring Cloud Consul
搭建 Spring Cloud Consul
Consul vs. Eureka
Consul vs Eureka vs Zookeeper
Why was Eureka 2.0 discontinued? #1129
关于Eureka 2.x,别再人云亦云了!
Eureka 2.0 is discontinued. What service discovery platform is Netflix using now?
Consul 是一个分布式服务注册与发现,用于跨任何运行时平台和公共或私有云连接、保护和配置服务。它内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案。
它是 go 语言写。
Spring Cloud Consul 是 Spring Cloud 家族的一个项目,致力于提供简洁的整合 Consul。
搭建的时候出现问题,可以在下面留言。
1. 问题列表
IllegalStateException: No instances available
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2. 部署 consul
从官网下载安装包,解压后运行下面的命令。
./consul agent -server -bootstrap-expect=1 -data-dir=consul-data -ui -bind=127.0.0.1
这只适合于测试环境,并不适合生产环境的部署。
3. 注册服务
3.1 服务生产者
新建一个 Spring Boot 工程,引入依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
代码
@RestController
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequestMapping("/")
public String home() {
return "Hello world";
}
}
3.2 添加应用名配置
在 application.properties
中配置
spring.application.name=data-service
启动服务,访问 http://localhost:8500/ui,可以看到服务注册到 consul 上了。
3.3 consul 的其他配置
ip
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
服务标识符
spring.cloud.consul.discovery.instanceid=${spring.application.name}:${random.value}
默认是 ${spring.application.name}:${profiles}:${port}
4. 服务发现
4.1 服务消费者
新建一个 Spring Boot 工程,引入同样的依赖。
@RestController
@SpringBootApplication
public class Application {
@Autowired
RestTemplate restTemplate;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@LoadBalanced
@Bean
public RestTemplate loadBalancedRestTemplate() {
return new RestTemplate();
}
@RequestMapping("/")
public String home() {
return this.restTemplate.getForObject("http://data-service", String.class);
}
}
5. 健康检查
6. 配置中心
6.2 通过UI页面进行配置
- 把
application.properties
重命名为bootstrap.properties
- 添加一条属性
spring.cloud.consul.config.enabled=true
就可以通过UI页面添加配置了。比如key是/config/data-service/test/msg
,value是Hello World from Spring Cloud Consul
。
测试代码
@RestController
class ExternalConfigurationController{
@Value("${test.msg}")
String value;
@GetMapping("/getConfigValue")
public String getConfigValue(){
return value;
}
}
6.1 结合git
我们总不能在生成环境也用UI页面进行配置吧,能不能像 Spring Cloud Config
一样使用 git 呢。答案是可以的,但是 consul 原生并不支持这种操作,那岂不是浪费了他的 K/V 特性,幸好有 git2consul。可惜他是用 node 实现的。
7. 参考文档
A Detailed Guide to Spring Cloud Consul
Consul Guides
git2consul使用踩过的坑
spring cloud: 使用consul来替换config server
springcloud2.x gitlab consul集成配置中心踩坑
推荐阅读
-
Spring Cloud Ribbon实现客户端负载均衡的示例
-
Spring学习之开发环境搭建的详细步骤
-
Spring Cloud Gateway网关XSS过滤Filter
-
Spring Cloud 之 Feign.
-
基于Spring Cloud Netflix的TCC柔性事务和EDA事件驱动示例
-
微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
-
spring-cloud项目搭建
-
Spring Cloud开发人员如何解决服务冲突和实例乱窜?(IP实现方案)
-
Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单
-
Spring Cloud入门程序