04 Consul服务注册与发现

1 Consul简介

Consul是一套开源的分布式服务发现与配置管理系统,由HashiCorp公司用go语言开发的。提供了微服务系统中的服务治理,配置中心,控制总线等功能,这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网络,总之Consul提供了一种完整的服务网络解决方法。
具有很多优点,包括:基于raft协议,比较简洁;支持健康检查;同时支持http和dns协议,支持跨数据中心的WAN集群,提供图形界面,跨平台,支持linux,mac,windows;

  • 服务发现:支持http和dns两种发现方式
  • 健康检查:支持多种,http,tcp,docker,shell脚本等定制化
  • kv键值对存储
  • 多数据中心
  • 可视化web界面

官网
中文翻译

1.1 安装

官网安装教程

  1. 下载
  2. 解压
  3. 配置环境变量即可,也可以直接将解压后的文件直接移动到你已经配好的环境变量目录下面,比如/usr/bin,/bin等目录。如果是自己的目录也很简单:
    • 编辑bash_profile文件,方式很多可以使用文本编辑器,也是使用命令。不多赘述
    • 添加环境变量
    • 保存
    • 执行这个 source ~/.bash_profile

环境变量可参考:
elasticSearch安装

  1. 查看是否安装成功
➜  ~ consul --version
Consul v1.6.1
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
  1. 使用开发者模式启动
consul agent -dev

启动日志中有这么一行,告诉我们客户端的http端口号是8500
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)

  1. 访问http://localhost:8500/
    在这里插入图片描述

2 服务提供者注册到consul

  1. 新建一个模块:cloud-provider-payment-consul,导入依赖
<dependencies>
        <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>
        <!--引入我们的api-common-->
        <dependency>
            <groupId>study.wyy</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--consul服务发现-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
    </dependencies>
  1. application.yml 配置
server:
  port: 8006
spring:
  application:
    name: consul-provider-payment
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}

  1. 主启动类
package study.wyy.cloud.consul.payment;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author by wyaoyao
 * @Description
 * @Date 2020/12/15 8:19 上午
 */
@EnableDiscoveryClient// 开启服务发现
@Slf4j
@SpringBootApplication
public class PaymentConsul {
    public static void main(String[] args) {
        SpringApplication.run(PaymentConsul.class,args);
    }
}
  1. 提供一个rest接口,
package study.wyy.cloud.consul.payment.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author by wyaoyao
 * @Description
 * @Date 2020/12/14 5:04 下午
 */
@RestController
public class HelloController {

    // 获取配置文件中的端口号
    @Value("${server.port}")
    private String port;

    @GetMapping("payment/consul/hello")
    public String hello(){
        return "Hello World From Port: " + port;
    }
}
  1. 启动,观察consul的web界面
    在这里插入图片描述
  2. 访问刚刚的rest接口http://localhost:8006/payment/consul/hello,是否正常

3 服务消费者注册到consul

  1. 新建一个model cloud-consumer-order-consul,导入依赖
<dependencies>
        <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>
        <!--引入我们的api-common-->
        <dependency>
            <groupId>study.wyy</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--consul服务发现-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
</dependencies>
  1. 配置文件

spring:
  application:
    name: consul-consumer-order
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}
server:
  port: 80
  1. 启动类
package study.wyy.cloud.consul.order;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author by wyaoyao
 * @Description
 * @Date 2020/12/15 9:52 上午
 */
@SpringBootApplication
@Slf4j
@EnableDiscoveryClient
public class OrderServiceConsul {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceConsul.class,args);
    }
}
  1. 配置一个RestTemplate
package study.wyy.cloud.consul.order.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author by wyaoyao
 * @Description
 * @Date 2020/12/15 9:53 上午
 */
@Configuration
public class BeanConfig {
    
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    
}
  1. 测试调用支付服务的接口
package study.wyy.cloud.consul.order.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author by wyaoyao
 * @Description
 * @Date 2020/12/15 10:19 上午
 */
@Slf4j
@RestController
public class OrderController {

    private final RestTemplate restTemplate;
    private final String PROVIDER_URL = "http://consul-provider-payment";
    public OrderController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping(("/consume/payment/consul/hello"))
    public String consume(){
        String result = restTemplate.getForObject(PROVIDER_URL + "/payment/consul/hello", String.class);
        return result;
    }
}
  1. 访问:http://localhost/consume/payment/consul/hello进行测试
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值