搭建 Spring Cloud Consul

℡╲_俬逩灬. 提交于 2019-12-27 04:05:10

搭建 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集成配置中心踩坑

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!