SpringCloud2020微服务实战项目(三)

Consul服务注册与发现

Consul 简介

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

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

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

SpringCloud2020微服务实战项目(三)_第1张图片

安装并运行 Consul

SpringCloud2020微服务实战项目(三)_第2张图片
SpringCloud2020微服务实战项目(三)_第3张图片

consul --version #查看consule版本
consul agent -dev #开启consul服务

SpringCloud2020微服务实战项目(三)_第4张图片
输入网址 localhost:8500/
SpringCloud2020微服务实战项目(三)_第5张图片

服务提供者

SpringCloud2020微服务实战项目(三)_第6张图片
cloud-providerconsul-payment8006
pom.xml

<dependencies>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-consul-discoveryartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
            <scope>runtimescope>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>

application.yml

server:
  port: 8006

spring:
  application:
    name: consul-provider-payment
  ###consul注册中心地址
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        #hostname: 127.0.0.1
        service-name: ${spring.application.name}

PaymentMain8006.java

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8006.class, args);
    }
}

controller.PaymentController.java

@RestController
@Slf4j
public class PaymentController {

    @Value("${server.port}")
    private String serverPort;
    
    @GetMapping("/payment/consul")
    public String paymentConsul(){
        return "SpringCloud with consul: "+ serverPort + "\t"+ UUID.randomUUID().toString();
    }
}

服务消费者(同服务提供者类似)

cloud-consumerconsul-order80
pom.xml

<dependencies>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-consul-discoveryartifactId>
        dependency>
        
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
            <scope>runtimescope>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
        dependency>
    dependencies>
### consul服务端口号
server:
  port: 801

spring:
  application:
    name: cloud-consumer-order
  ###consul服务注册中心
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        #hostname: 127.0.0.1
        service-name: ${spring.application.name}

OrderConsulMain80.java

@SpringBootApplication
@EnableDiscoveryClient
public class OrderConsulMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderConsulMain80.class, args);
    }
}

con.ApplicationContextConfig.java
用来注入RestTemplate的bean

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

controller.OrderConsulController

@RestController
@Slf4j
public class OrderConsulController {
    public static final String INVOKE_URL ="http://consul-provider-payment";

    @Resource
    private RestTemplate restTemplate;

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

测试
前提是consul服务器开启。现在启动PaymentMain8006和OrderConsulMain80,
SpringCloud2020微服务实战项目(三)_第7张图片
上图可以看出已经两个微服务已经被注册进Consul中了。
下图测试PaymentMain8006
SpringCloud2020微服务实战项目(三)_第8张图片
下图测试OrderConsul80
SpringCloud2020微服务实战项目(三)_第9张图片

三个注册中心的异同SpringCloud2020微服务实战项目(三)_第10张图片

SpringCloud2020微服务实战项目(三)_第11张图片
CAP
最多只能同时较好的满足两个。
CAP的核心理论是:一个分布式系统不可能同时很好的满足一致性,可用和分区容错性三个需求。因此,根据CAP原理将NoSQL 数据分成了满足 CA 原则、满足CP原则和满足AP原则三大类。

  • CA - 单点集群,满足一致性,可用性的系统,通常拓展性不是特别强大。

  • CP - 满足一致性,分区容错性的系统,通常性能不是特别高

  • AP - 满足可用性,分区容错性的系统,通常对一致性的要求要低一些。

你可能感兴趣的:(SpringCloud2020微服务实战项目(三))