Consul官網:https://www.consul.io/
Consul簡介:
Consul 是一套開源的分布式服務發現和配置管理系統,由 HashiCorp 公司 用 Go 語言開發。
它提供了微服務系統中的 服務治理、配置中心、控制總線等功能。這些功能中的每一個都可以根據需要單獨使用,也可以一起使用以構建全方位的服務網格,總之Consul 提供了一種完整的服務網格解決方案。
它具有很多優點。包括:基於raft 協議,比較簡潔;支持健康檢查,同時支持HTTP和DNS協議,支持跨數據中心的WAN集群,提供圖形界面,跨平台,支持Linux、Mac、Windows。
下載地址:https://www.consul.io/downloads
中文文檔地址:https://www.springcloud.cc/spring-cloud-consul.html
下載完成后只有一個 consul.exe文件,可以在當前路徑下用cmd控制台查看版本信息、啟動
以開發模式啟動:consul agent -dev
訪問:http://localhost:8500
Consul的使用:
核心步驟:
1. POM引入依賴。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
2. YML配置。
spring:
application:
name: cloud-payment-service
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
3. 啟動類添加注解。
@EnableDiscoveryClient
示例:
新建支付服務: cloud-providerconsul-payment8006
POM:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>yct-cloud-parent</artifactId> <groupId>com.yct.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-providerconsul-payment8006</artifactId> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-consul-discovery --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>com.yct.springcloud</groupId> <artifactId>cloud-base-mybatisplus</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.yct.springcloud</groupId> <artifactId>cloud-base-api</artifactId> <version>${project.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-typehandlers-jsr310 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-typehandlers-jsr310</artifactId> <version>1.0.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
YML:

server: port: 8006 spring: application: name: cloud-payment-service datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456 cloud: consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name} mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #開啟sql日志 mapper-locations: classpath:mapper/*.xml type-aliases-package: com.yct.springcloud.entity.*
主啟動類:

package com.yct.springcloud; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @MapperScan("com.yct.springcloud.mapper") @EnableDiscoveryClient public class ProviderPaymentApplication8006 { public static void main(String[] args) { SpringApplication.run(ProviderPaymentApplication8006.class,args); } }
從其他支付微服務(例如:cloud-provider-payment8002 項目)項目復制其他所有代碼,修改controller中的訪問路徑(加個/consul 表示是Consul的服務),其他都不用改。
測試:
新建消費者 訂單服務:cloud-consumerconsul-order8081
POM:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>yct-cloud-parent</artifactId> <groupId>com.yct.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-consumerconsul-order8081</artifactId> <dependencies> <dependency> <groupId>com.yct.springcloud</groupId> <artifactId>cloud-base-api</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-consul-discovery --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
YML:

server:
port: 8081
spring:
application:
name: consul-order-service
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
配置Bean:

package com.yct.springcloud.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; @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
Controller:

package com.yct.springcloud.controller; import com.yct.springcloud.entity.pay.Payment; import com.yct.springcloud.support.CommonResult; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.awt.*; /** * 訂單Controller */ @RestController @Slf4j public class OrderController { public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE"; @Resource private RestTemplate restTemplate; @PostMapping("/consumer/payment/consul/create") public CommonResult<Payment> create(Payment payment) { log.info("Consumer:插入支付【" + payment + "】"); return restTemplate.postForObject(PAYMENT_URL + "/yct/payment/consul/insertPayment", payment, CommonResult.class); //寫操作 } @GetMapping(value = "/consumer/payment/consul/get/{id}"/*,produces = { "application/json;charset=UTF-8" }*/) public CommonResult<Payment> getPayment(@PathVariable("id") Long id) { log.info("Consumer:根據id【" + id + "】查詢支付數據。"); return restTemplate.getForObject(PAYMENT_URL + "/yct/payment/consul/get/" + id, CommonResult.class); } }
主啟動類:

package com.yct.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class CustomerOrderApplication8081 { public static void main(String[] args) { SpringApplication.run(CustomerOrderApplication8081.class,args); } }
兩個訂單服務的結構也是一樣的,只是當前訂單服務注冊進了Consul。之前的注冊進了Eureka。
測試: