什么是Consul
文章目录
Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp 公司用Go语言开发。
Consul提供了微服务系统中的服务治理、配置中心、控制总线等功能。
这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格
Consul具有很多优点
- 基于 Raft 协议
- 比较简洁
- 支持健康检查
- 同时支持 HTTP 和 DNS 协议
- 支持跨数据中心的 WAN 集群提供图形界面跨平台
- 支持 Linux、Mac、Windows
Consul安装
linxu安装
windows安装
进入 Consul官网
选择对应的版本,下载到本地
进入consul解压位置,在地址栏输入cmd进入命令行
启动Consul服务端
//启动consul服务
consul agent -dev
大家尽量使用docker进行安装测试,更加方便简单,并且对以后工作中使用docker很有帮助
测试Consul连通
输入网址
http://localhost:8500/
跳转到Consul监控界面则表示启动成功!
Consul服务注册
Consul的功能很强大,这里我们就先使用它服务注册功能
实验目的:
模拟用户访问发送请求,微服务提供方搭建一个小型集群,采用轮询方式接受请求并相应给客户端
1、服务提供者8007、8008和8009
建moudle
创建三个moudle
cloud-providerconsul-payment8007
cloud-providerconsul-payment8008
cloud-providerconsul-payment8009
改pom
这里使用的springboot与springcloud对应的版本为
<spring.boot.version>2.2.2.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR1</spring.cloud.version>
在每个模块中添加springboot与consul整合包依赖
<!--SpringBoot整合consul客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
写yml
三个模块的配置大体相同,只有端口不同
server:
port: 8007
#服务别名 ---注册到服务中心
spring:
application:
name: consul-provider-payment
####consul注册中匈地址
cloud:
consul:
host: localhost //主机ip
port: 8500
discovery:
service-name: ${spring.application.name}
主启动
在主启动类上添加@EnableDiscoveryClient注解开启服务发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentConsulMain8007 {
public static void main(String[] args) {
SpringApplication.run(PaymentConsulMain8007.class, args);
}
}
业务类
因为我们测试的是consul的注册中心功能,所以我们只需要简单的实现服务调用功能即可。
于是我们简单的区别出集群中三个服务提供者的端口即可验证
三个模块的业务类都相同
package com.lejia.springcloud.controller
@RestController
@Slf4j
@RequestMapping("/payment")
public class PaymentController {
@Value("${server.port}")
private String serverPort;
//验证当前服务提供者的端口,即可验证实现了集群访问功能
@GetMapping(value="/consul")
public String paymentConsul(){
return "SpringCloud with Consul:"+serverPort+"\t"+ UUID.randomUUID().toString();
}
}
启动测试
启动项目之前不要忘记先启动consul服务端哦
2、服务消费者80
服务消费者主要的功能等同于用户,其调用服务端暴露的端口来实现真实的访问场景
建moudle
cloud-consumerconsul-order80
改pom
与服务提供者相同
写yml
server:
port: 80
###注册到服务中心的服务名
spring:
application:
name: cloud-consumerconsul-order
###consul注册中心
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
主启动
在主启动上添加@EnableDiscoveryClient开启服务发现
@SpringBootApplication
@EnableDiscoveryClient
public class OrderConsulMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderConsulMain80.class, args);
}
}
业务类
新建配置类
package com.lejia.springcloud.config;
新建RestTemplate对象,其主要功能为进行远程服务的调用
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //开启负载均衡功能 默认为轮询
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
新建controller
package com.lejia.springcloud.controller;
暴露给用户的访问接口,实现远程访问服务端提供的集群服务
@RestController
@Slf4j
@RequestMapping("/consumer")
public class OrderConsulController {
private final String INVOCATION_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping("/payment/consul")
public String payment(){
return restTemplate.getForObject(INVOCATION_URL+"/payment/consul", String.class);
}
}
启动测试
查看consul监控界面,可以发现我们的服务都已经注册到中心上了
3、服务访问测试
输入暴露给用户访问的接口测试
http://localhost/consumer/payment/consul
连续三次访问,我们可以看出,服务由集群中8007/8008/8009分别提供,我们想要实现的初步目标已经达成了。
在实际生产中,我们要进行的不单单是简单的轮询算法,而是会根据实际情况来选择适合的负载均衡算法,如果你对此感兴趣,可以自行查找其他关于负载均衡的文章。
感谢你的观看,你的每一个点赞都是对我最大的帮助!