【微服务】- Consul整合SpringCloud及使用

  • Post author:
  • Post category:其他




简介

Consul是-套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发。

提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要 单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。

它具有很多优点。包括:基于raft协议,比较简洁;支持健康检查, 同时支持HTTP和DNS协议支持跨数据中心的WAN集群提供图形界面跨平台,支持Linux、Mac、 Windows



功能



服务发现

提供HTTP和DNS两种发现方式。



健康监测

支持多种方式,HTTP、TCP、 Docker、Shell脚本定制



KV存储

Key、Value的存储方式



多数据中心

Consul支持多数据中心



可视化Web界面

图片



consul安装与使用

直接在官网下载


https://www.consul.io/downloads.html



使用

下载完后直接解压得到一个exe文件

图片

在这个位置打开cmd运行

图片



consul占用的端口号是8500

启动consul后访问8500端口就可以
图片

完成。



Consul实现注册功能

我提供的项目仅仅是搭了一个框架具体的实现,可以有具体的项目写。



注册provider提供者的服务



建项目

cloud-provider-consul-payment8085



写pom

<dependencies>
    <dependency>
        <groupId>wf.springcloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <!--   引入consul客户端     -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>

</dependencies>



写yml

server:
  port: 8085

# 服务别名---zookeeper注册中心名称
spring:
  application:
    name: consul-provider-payment
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
    username: root
    password: 123456



主启动

@SpringBootApplication
@EnableDiscoveryClient
public class PaumentConsulMain8085 {

    public static void main(String[] args) {
        SpringApplication.run(PaumentConsulMain8085.class,args);
    }
}



controller

@RestController
@Slf4j
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "/payment/consul")
    public String paymentzk(){
        return "springcloud with consul: " + serverPort + "\t" + UUID.randomUUID().toString();
    }
}



写consumer消费者服务



建项目

cloud-consumer-consul-order80



写pom

同provider的pom



写yml

server:
  port: 80

# 服务别名---zookeeper注册中心名称
spring:
  application:
    name: consul-consumer-payment
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
    username: root
    password: 123456



主启动

@SpringBootApplication
@EnableDiscoveryClient
public class OrderMain80 {

    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class,args);
    }
}



配置类

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getTemplate(){
        return new RestTemplate();
    }
}



controller

@RestController
@Slf4j
public class OrderController {


    private static final String INVOKE_URL = "http://consul-provider-payment";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/payment/consul")
    public String paymentInfo(){
        String result = restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class);
        return result;
    }

}



启动上面两个服务,测试

图片

图片
图片

成功



Eureka、Zookeeper和Consul三个注册中心的异同点

之前我已经写过Eureka

https://blog.csdn.net/gyhdxwang/article/details/105235899

和Zookeeper

https://blog.csdn.net/gyhdxwang/article/details/105261615

现在我们俩看看这三个注册中心的异同

图片

图片



cpa是什么

  • C:Consistency (强一 致性)
  • A:Availability (可用性)
  • P:Partition tolerance (分区容错性)

CAP理论关注粒度是数据,而不是整体系统设计的策略。


最多只能同时较好的满足两个。一个系统必须保证P即分区容错性


CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性, 可用性和分区容错性这三个需求,

因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:

  • CA-单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP-满足一致性,分区容忍必的系统,通常性能不是特别高。
  • AP -满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。



AP架构

当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。

结论:违背了一致性C的要求,只满足可用性和分区容错,即AP

图片



CP架构

当网络分区出现后,为了保证工一致性,就必须拒接请求,否则无法保证一致性

结论:违背了可用性A的要求,只满足一致性和分区容错, 即CP

图片



版权声明:本文为gyhdxwang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。