Consul服务注册与发现

官网

consul是什么:

Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。领事需要数据平面,并支持代理和本机集成模型。Consul附带了一个简单的内置代理,因此一切都可以直接使用,还支持Envoy等第三方代理集成。

Consul是一个用来实现分布式系统的服务发现与配置的开源工具。他主要由多个组成部分:

  • **服务发现:**客户端通过Consul提供服务,类似于API,MySQL,或者其他客户端可以使用Consul发现服务的提供者。使用类似DNS或者HTTP,应用程序和可以很轻松的发现他们依赖的服务。
  • **检查健康:**Consul客户端可以提供与给定服务相关的健康检查(Web服务器返回200 ok)或者本地节点(“内存利用率低于90%”)。这些信息可以监控集群的运行情况,并且使访问远离不健康的主机组件。
  • **键值对存储:**应用程序可以使用Cousul的层级键值对。
  • **多数据中心:**Consul有开箱及用的多数据中心。

下载

下载链接

下载之后解压只有一个exe后缀的程序

官网说明

运行

cmd

使用consul实现服务注册中心的 功能

创建服务提供者 cloud-providerconsul-payment8006

  • pom

    <dependencies>
        <!--SpringCloud consul-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</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.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>
    
  • yml

    server:
      # consul服务端口
      port: 8006
    spring:
      application:
        name: cloud-provider-payment
      cloud:
        consul:
          # consul注册中心地址
          host: localhost
          port: 8500
          discovery:
            hostname: 127.0.0.1
            service-name: ${spring.application.name}
    
  • 主启动类

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

    @RestController
    @Slf4j
    public class PaymentController {
        @Value("${server.port}")
        private String serverPort;
    
        @RequestMapping(value = "/payment/consul")
        public String paymentConsul() {
            return "SpringCloud with consul:" + serverPort + "\t" + UUID.randomUUID().toString();
        }
    
    }
    
  • 测试

    image-20200324102717494

创建 服务消费者 cloud-consumerconsul-order80

  • pom

    <dependencies>
        <!--SpringCloud consul-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</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.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>
    
  • yml

    server:
      port: 80
    
    spring:
      application:
        name: cloud-consumer-order
      cloud:
        consul:
          # consul注册中心地址
          host: localhost
          port: 8500
          discovery:
            hostname: 127.0.0.1
            service-name: ${spring.application.name}
    
  • 主启动类

  • config

    @Configuration
    public class ApplicationConfig {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    
  • controller

    @RestController
    @Slf4j
    public class OrderController {
    
        private static final String PAYMENT_URL="http://cloud-provider-payment";
        @Resource
        private RestTemplate restTemplate;
    
        @GetMapping("/consumer/payment/consul")
        public String paymentInfo() {
            return restTemplate.getForObject(PAYMENT_URL + "/payment/consul", String.class);
        }
    
    }
    
  • 测试image-20200324103336800

还有记得consul的service是服务掉线了不会立马注销,而是过段时间之后才会注销

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

只有不断的努力才会有更大的惊喜等着你去发现!!