springcloud+consul 单机与集群
springcloud+consul 单机与集群
单机(dev模式)
一.consul的下载与安装
1.consul官网(本文档包含windows与linux版本)
https://www.consul.io/downloads.html
关于consul版本,其实差异不大,主要在于一些ui上的差距,我这边用的是1.3版本。
2.下载好后直接解压,解压后的文件夹内,只有一个可执行的consul.exe
文件(windows系统版本,Linux系统版本的压缩包可以在windows环境下解压,文件夹内仅有一个consul文件,无法执行)。
3.配置环境变量(便于在cmd窗口直接打开,不配置的话需要在cmd窗口内进入consul.exe
文件所在位置),在计算机的环境变量的path中添加consul.exe
的位置。
4.在cmd窗口中执行
consul agent -dev
后,consul即为执行状态可以通过ctrl+c直接退出consul,consul的默认端口位8500
5.访问
http://localhost:8500
当出现以上状态时,windows下的consul安装以及启动就成功了!
二.springcloud+sonsul的单机测试(IDE:Intellij Idea)
1.创建一个父工程,引入consul测试所需要的所有依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.maxus</groupId>
<artifactId>consul-test</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>consul-test-server1</module>
<module>consul-test-client</module>
<module>consul-test-zuul</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--consul中健康检查需要用到actuator,不添加会check failing-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.创建子工程,可以先创建一个作为测试。
3.配置文件application.yml
,有许多文章上面关于配置文件的说法不一,亲测不一定需要bootstrap.yml
,只需要在application.yml
中关于consul
的配置在其他配置前面就不会有问题
spring:
application:
name: consul-client
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: consul-client #注册在consul上面的名字,在consul的调用中,是通过此名字调用的
register-health-check: true #健康检查,保证服务处于启动状态,建议开启
server:
port: 8582
4.启动类
@SpringBootApplication
@EnableDiscoveryClient //此注解为consul注册配置
public class ConsulClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulClientApplication.class, args);
}
}
5.编写HealthCheckController.java
,当配置文件中存在register-health-check: true
时,consul会一直给所注册的服务发送/health
请求,用以确认服务的存活。
@RestController
public class HealthCheckController {
@GetMapping("/health")
public String healthCheck() {
return "health";
}
}
6.运行springboot项目后
服务注册成功
三.微服务的负载均衡
1.consul会对注册在节点上的微服务做负载均衡,主要实现方式是,相同的微服务,通过更改端口进行再次注册
这样在注册中心就存在两个相同的servicer-name
的微服务了
2.编写gateway,使用zuul来隐藏这两个微服务的实际ip,对外路由成同一的访问方式
1.创建zuul子项目,引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>consul-test</artifactId>
<groupId>com.maxus</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consul-test-zuul</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
</project>
2.配置文件
spring:
application:
name: consul-zuul
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: consul-zuul
register-health-check: true
server:
port: 8583
zuul:
routes:
consul-client: /client/** #将`spring.application.name=consul-client`的微服务路由成访问路径为/client
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 80000
3.启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
@RefreshScope //此注解为自动刷新配置文件,根据需求添加
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
4.HealthCheckController类
@RestController
public class HealthCheckController {
@GetMapping("/health")
public String healthCheck() {
return "health";
}
}
5.启动zuul
6.修改consul-client
服务,添加PrintController
@RestController
public class PrintController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/print")
public String print() {
ServiceInstance serviceInstance = loadBalancerClient.choose("consul-client");
return "this is " + serviceInstance.getUri();
}
}
7.重启consul-client
服务,通过网关访问
http://localhost:8583/client/print
结果为“this is http://[计算机名称]:8582”与"this is http://[计算机名称]:8482"切换,其本质为轮询,当其中一个服务请求量过大时,consul会暂时隐藏此服务。
(server模式)[基于centos6.5 linux系统,建议大家实操的时候也使用虚拟机,至少3台虚拟机]
环境:
192.168.206.129
192.168.206.130
192.168.206.131
一.linux系统安装consul,
1.将下载的对应的 consul压缩包在windows环境解压后,将文件夹复制到linux的/usr
中,在/usr/consul
中mkdir data
,(所有虚拟机操作相同)
2.启动(注意更改对应的ip)
./consul agent -server -ui -bootstrap-expect 3 -data-dir=data -node=node0 -bind=192.168.206.129 -client=0.0.0.0 -datacenter=dc1 &
./consul agent -server -ui -bootstrap-expect 3 -data-dir=data -node=node1 -bind=192.168.206.130 -client=0.0.0.0 -datacenter=dc1 &
./consul agent -server -ui -bootstrap-expect 3 -data-dir=data -node=node2 -bind=192.168.206.131 -client=0.0.0.0 -datacenter=dc1 &
对应的参数,网上资料很详细,这里就不解释了
3.集群
在192.168.206.129中执行
./consul join 192.168.206.130
在192.168.206.131中执行
./consul join 192.168.206.130
这样就集群成功了,查看集群
./consul members
在任意一台虚拟机中查看结果都是相同的
./consul info
可以查看当前node的详细信息
四.关于多数据中心
在执行启动命令时,都有追加-datacenter=dc1
,这表明此为dc1数据中心的,若启动一台新的虚拟机,并以-datacenter=dc2
启动,表明此为dc2数据中心,可以将两个数据中心联合起来,但是对于数据或者服务而言,没有影响,这两个数据中心拥有自己的gossip pool,只是利于使用者管理,如下图所示,可以切换数据中心进行对应的配置修改
五.关于consul的优点(个人见解,欢迎补充,修正)
consul主要就是在一个数据中心中,其kv是相通的,由于流言协议的原因,保证了高度的一致性,可以使用kv来对注册中心的所有微服务进行统一配置;关于负载均衡方面,通过ngnix对所有的网关进行反向代理,实现了网关的负载均衡,不论请求最终走的是哪一个网关,对于同一个数据中心的微服务而言,都是可以访问到的,consul会对所有的微服务通过轮询的方式,实现负载均衡
六.关于集群的一些操作,推荐一篇文章,很详细
https://blog.****.net/chenchong08/article/details/77885989
eureka的闭源,导致许多公司开始研究consul,本人也处于研究阶段,欢迎各位大牛对本文进行指正,也欢迎将自己的总结共享,作者邮箱[email protected]