Spring Cloud 学习笔记之——04 Consul服务注册与发现

目录

Consul 简介

​创建服务提供者模块:cloud-providerconsul-payment8006

创建服务提供者模块:cloud-consumerconsul-order80

三个注册中心异同点


Consul 简介

        Consul 是一个服务网格解决方案,提供功能齐全的控制平面,具有服务发现、配置和分段功能。这些特性中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。concul 需要一个数据平面,并支持代理和本机集成模型。领事船与一个简单的内置代理,使一切工作的开箱即用,但也支持第三方代理集成,如特使。

        Consul的主要特点是:
        服务发现:Concul 的客户端可以注册一个服务,如api或mysql,其他客户端可以使用Concul来发现给定服务的提供者。使用DNS或HTTP,应用程序可以轻松找到它们所依赖的服务。
        运行状况检查:Concul 客户端可以提供任意数量的运行状况检查,与给定服务(“Web服务器是否返回200 OK”)或本地节点(“内存利用率是否低于90%”相关。操作员可以使用此信息监视群集运行状况,服务发现组件也可以使用此信息将流量路由到不健康的主机。
        KV存储:应用程序可以将Consor的分层键/值存储用于任何目的,包括动态配置、功能标记、协调、领导人选举等。简单的HTTP API使其易于使用。
        安全服务通信:Consul 可以为服务生成和分发TLS证书,以建立相互TLS连接。意图可用于定义允许哪些服务进行通信。服务分段可以很容易地管理,目的可以实时更改,而不是使用复杂的网络拓扑和静态防火墙规则。
        多数据中心:Consul 支持多个现成的数据中心。这意味着concul 的用户不必担心构建额外的抽象层来扩展到多个区域。
        Concul 的设计宗旨是对DevOps社区和应用程序开发人员都友好,这使它非常适合现代、弹性的基础设施。

       Consul 下载地址:Downloads | Consul by HashiCorp

       使用教程:Spring Cloud Consul 中文文档 参考手册 中文版

       安装运行:Install Consul | Consul - HashiCorp Learn,下载完成后只有一个consul.exe文件.

        使用开发者模式启动,  consul.exe 文件目录下进入 cmd,输入consul agent -dev 进入开发者模式。

创建服务提供者模块:cloud-providerconsul-payment8006

1、POM依赖

 <dependencies>
        <dependency>
            <groupId>com.yixuan.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </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.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

        <!--热部署模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2、YML 依赖

server:
  port: 8006

spring:
  application:
    # 微服务名称
    name: cloud-provider-payment

  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}

3、主启动类 com.atyixuan.springcloud.PaymentMain8006

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

4、业务类  com.atyixuan.springcloud.controller.PaymentController

@RestController
public class PaymentController {

    @Value("S{server.port}")
    private String serverPort;


    @GetMapping(value = "/payment/consul")
    public String paymentConsul(){
        return "spring cloud with consul: " + serverPort+"\t" + UUID.randomUUID().toString();
    }
}

5、验证测试:http://localhost:8006/payment/consul

创建服务提供者模块:cloud-consumerconsul-order80

1、POM 依赖

 <dependencies>

        <!--引入自己定义的 api 通用包,可以使用 Payment 支付 entity-->
        <dependency>
            <groupId>com.yixuan.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </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-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2、YML 配置文件

server:
  port: 80

spring:
  application:
    name: cloud-consumer-order
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}

3、主启动类 com.atyixuan.springcloud.controller.OrderConsulController

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

    @Resource
    private RestTemplate restTemplate;

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

4、配置 Bean com.atyixuan.springcloud.config.ApplicationContextConfig

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

5、Controller 类 com.atyixuan.springcloud.controller.OrderConsulController

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

    @Resource
    private RestTemplate restTemplate;

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

项目结构

测试:先启动 cloud-providerconsul-payment8006,再启动 cloud-consumerconsul-order80

浏览器输入:http://localhost/consumer/payment/consul

浏览器输入:http://localhost:8500

三个注册中心异同点

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

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

经典 CAP 图

AP(Eureka)

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

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

CP(Zookeeper/Consul)

CP 架构:当网络分区出现后,为了保证一致性,就必须拒绝请求,否则无法保证一致性

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值