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

springcloud+consul 单机与集群

当出现以上状态时,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项目后
springcloud+consul 单机与集群

服务注册成功

三.微服务的负载均衡

1.consul会对注册在节点上的微服务做负载均衡,主要实现方式是,相同的微服务,通过更改端口进行再次注册
springcloud+consul 单机与集群

springcloud+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
springcloud+consul 单机与集群

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/consulmkdir 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,只是利于使用者管理,如下图所示,可以切换数据中心进行对应的配置修改
springcloud+consul 单机与集群

五.关于consul的优点(个人见解,欢迎补充,修正)

​ consul主要就是在一个数据中心中,其kv是相通的,由于流言协议的原因,保证了高度的一致性,可以使用kv来对注册中心的所有微服务进行统一配置;关于负载均衡方面,通过ngnix对所有的网关进行反向代理,实现了网关的负载均衡,不论请求最终走的是哪一个网关,对于同一个数据中心的微服务而言,都是可以访问到的,consul会对所有的微服务通过轮询的方式,实现负载均衡

六.关于集群的一些操作,推荐一篇文章,很详细

https://blog.csdn.net/chenchong08/article/details/77885989

​ eureka的闭源,导致许多公司开始研究consul,本人也处于研究阶段,欢迎各位大牛对本文进行指正,也欢迎将自己的总结共享,作者邮箱[email protected]