文章目录
写在前面
文章参考 Spring-cloud-consul 的官方文档
学习微服务最好使用容器来搭建,对于正在学习编程的小伙伴推荐买上属于自己的一台服务器,用来练练手,也顺带学习 Docker,这很重要。最近,阿里在搞活动,新用户 1C2G 只要 98 一年,我也比较了很多,还是比较划算的,我自己也入手了,可以点进来看看,对了,最便宜的一款在 【全部必抢爆款】 里面: 阿里云服务器,助力云上云!
通过自动配置、绑定到Spring Environment
和 其它的 Spring 编程模型习惯用法,Spring Cloud Consul
为 Spring Boot
应用程序提供了 consul 集成。通过简单的注释,便可以快速启用和配置应用程序中的公共模式,并使用 Hashicorp
的 consul 来构建大型分布式系统。提供的模式包括 服务发现,分布式配置和控制总线。
Spring Cloud Consul Features:
- 服务发现:通过Consul 代理注册实例,并且客户端可以使用 Spring 管理的 Bean 发现实例
- 支持 Ribbon ,客户端负载均衡器
- 支持 Spring Cloud LoadBalancer - Spring Cloud 项目的客户端负载均衡器
- 支持 Zuul,动态路由和过滤器
- 分布式配置:使用 Consul key/value store
- 控制总线:使用 Consul 事件的分布式控制事件
1. 安装 Consul
下载文件压缩包,解压后,为该二进制程序配置环境变量,执行 consul -v
命令;或者直接在当前文件夹下,打开控制台,执行 consul -v
命令。我们先获得这样的一个可执行程序备用。
2. Consul Agent
Consul Agent
必须对所有的 Spring cloud Consul 应用程序都可用。默认情况下,代理客户端位于 localhost:8500
,UI 可以从 http://localhost:8500
获得。
consul agent 是 consul 的核心过程,该 agent 维护成员资格信息,注册服务,运行检查,响应查询等等。该 agent 必须在 consul 集群中的每个节点上运行。
任何代理都可以以下两种模式之一运行:客户端或服务器。服务器节点承担成为共识仲裁一部分的额外责任。这些节点参与Raft,并在发生故障的情况下提供强大的一致性和可用性。服务器节点上较高的负担意味着它们通常应在专用实例上运行-它们比客户端节点耗费更多的资源。客户端节点构成了集群的大部分,它们非常轻巧,因为它们与服务器节点进行接口以进行大多数操作,并且很少维护自己的状态。
3. consul 服务发现
服务发现是基于微服务的体系结构的关键原则之一。尝试手动配置每个客户端或某种形式的约定,都会非常困难且脆弱。consul 通过 HTTP API 和 DNS 提供服务发现服务。
3.1 入门
-
构建服务 consul-server-register。
-
导入依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
编写启动类
@SpringBootApplication @RestController public class Application { @RequestMapping("/") public String home(){ return "Hello world"; } public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(WebApplicationType.SERVLET).run(args); } }
当
spring-cloud-starter-consul-discovery
存在服务的类路径时,将自动使用 consul 的服务发现。可以通过spring.cloud.consul.discovery.enabled = false
或者spring.cloud.discovery.enabled = false
来禁用consul
服务发现。使用spring.cloud.consul.discovery.register = false
来禁用服务注册。 -
编写配置文件
spring: application: name: consul-server-register cloud: consul: host: localhost port: 8500 server: port: 8090
如果使用
Spring Consul Config
, 上面的值需要被放在bootstrap.yml
文件,而不是application.yml
。 -
以服务器模式启动 consul agent:
consul agent -dev
切勿在生产环境下运行该命令,并且不建议使用单服务器生产部署。应该在生产中运行三到五台服务器(奇数数量)。我们可以打开一个新的命令窗口,通过
consul members
查看。
运行启动类,访问 consul ui 界面:
发现有一个服务检测失败了,打开详情页面:
原来进行检测,需要请求 /actuator/health
端点(我们也可以通过 consul 的命令行窗口看见类似的错误)。所以我们上面的服务需要增加一个依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
重启服务,问题解决,服务正常。
官方文档提到:“当客户机向 consul
注册时,它提供关于自身的元数据,如主机和端口、id、名称和标记。缺省情况下会创建一个HTTP检查,consul
每10秒命中/health
端点一次。如果健康检查失败,服务实例将被标记为critical
。”
3.2 将 Management
注册为单独的服务
当 management
服务端口不同于应用程序端口时,management
将被注册为单独的服务:
spring:
application:
name: consul-server-register
cloud:
consul:
host: localhost
port: 8500
server:
port: 8090
management:
server:
port: 8091
修改配置文件为以上内容,重启服务。consul UI 界面会多一个 service。
3.3 服务发现
如果想使用 RestTemplate
访问已经注册的服务, 只需要像这样声明 RestTemplate
:
@LoadBalanced
@Bean
public RestTemplate loadbalancedRestTemplate() {
return new RestTemplate();
}
像这样使用它:
@RequestMapping("/")
public String home(){
return loadbalancedRestTemplate().getForEntity("http://consul-server-register/", String.class).getBody();
}
如果在多个数据中心中有 consul 集群,并且希望访问另一个数据中心中的服务,仅使用服务名称/id是不够的。在这种情况下,您将使用属性 spring.cloud.consul.discovery.datacenters.STORES=dc-west
,其中STORES
是服务名称/id, dc-west是STORES服务所在的数据中心。
除此之外,我们还可以使用 DiscoveryClient
,它为客户端提供了一个简单的 API ,而不是专门针对 Netflix 的。
@Autowired
private DiscoveryClient discoveryClient;
public String serviceUrl() {
List<ServiceInstance> list = discoveryClient.getInstances("consul-server-register");
if (list != null && list.size() > 0 ) {
return list.get(0).getUri().toString();
}
return null;
}
// 返回 http://DESKTOP-UH85822:8090
4. consul 分布式配置管理
Consul
提供了 key/value
存储来存储配置和其它元数据。Spring Cloud consul
配置是配置服务器和客户端的替代品。在特殊的“引导”阶段将配置加载到Spring环境中。配置默认存储在/config
文件夹中。根据应用程序的名称和活动配置文件创建多个PropertySource
实例,这些活动配置文件模仿Spring Cloud
配置中解析属性的顺序。例如,一个名为 “testApp” 并带有 “dev” 配置文件的应用程序将创建以下属性源:
config/testApp,dev/
config/testApp/
config/application,dev/
config/application/
最具体的属性源位于顶部,最不具体的属性源位于底部。config/application
文件夹中的属性适用于所有使用consul
进行配置的应用程序。config/testApp
文件夹中的属性只对名为“testApp”的服务实例可用。
在应用程序启动时读取配置,向/refresh
发送HTTP POST
请求将导致重新加载配置。Config Watch
也会自动检测更改并重新加载应用程序上下文。
4.1 入门
-
基于之前构建的 consul-server-register 服务。
-
新增以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId> </dependency>
-
编写 bootstrap.yml 配置文件来自定义 consul config:
spring: cloud: consul: config: enabled: true prefix: configuration defaultContext: consul-server-register profileSeparator: '::' data-key: config format: yaml
enabled
表示是否禁用 consul configprefix
设置配置值的基本文件夹defaultContext
: 设置所有应用程序使用的文件夹名profileSeparator
: 设置分隔符的值,用于分割属性源配置文件名(profiles)data-key
: key 值format
: value值的格式
-
修改配置中心的 key/value:
-
保存以上修改,重新运行 consul-server-register 服务。
服务最终运行在了 8099 端口,并且 management
端口也变为了 8098(覆盖了我们之前在 application.yaml 文件中的配置)。
如果你觉得我的文章对你有所帮助,欢迎关注我的公众号。赞!
认认真真学习,做思想的产出者,而不是文字的搬运工。错误之处,还望指出!