文章目录
1、简介
Consul
是一套开源的分布式服务发现和配置管理系统,由HashiCorp
公司用Go
语言开发。提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul
提供了一种完整的服务网格解决方案。
它具有很多优点。包括:基于
raft
协议,比较简洁;支持健康检查,同时支持HTTP
和DNS
协议支持跨数据中心的WAN
广域网集群提供图形界面跨平台,支持Linux
、Mac
、Windows
2、启动
下载完成以后直接就只有一个
exe
文件,我们可以直接双击启动,或者cmd
命令行启动它
查看版本号
启动
consul agent -dev
浏览器访问管理页面
localhost:8500
3、注册服务提供者
①、建module
②、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>SpringCloudDemo</artifactId>
<groupId>com.phz.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>CloudProviderPayment8006</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.phz.springcloud</groupId>
<artifactId>CloudAPI</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.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
③、YML
server:
port: 8006
spring:
application:
name: cloud-payment-service
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
enabled: true
instance-host: 192.168.1.6
④、主启动类
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 16:53
* @projectName SpringCloudDemo
* @className PaymentMain8006.java
* @description TODO
*/
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8006.class, args);
}
}
⑤、业务类
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 16:54
* @projectName SpringCloudDemo
* @className PaymentController.java
* @description TODO
*/
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/consul")
public String paymentConsul() {
return "SpringCloud with consul: " + serverPort + "\t" + UUID.randomUUID().toString();
}
}
⑥、测试
4、注册服务消费者
①、建module
②、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>SpringCloudDemo</artifactId>
<groupId>com.phz.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>CloudConsumerOrder8007</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.phz.springcloud</groupId>
<artifactId>CloudAPI</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.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
③、YML
server:
port: 8007
spring:
application:
name: cloud-payment-service
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
enabled: true
instance-host: 192.168.1.6
④、主启动
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 17:02
* @projectName SpringCloudDemo
* @className OrderMain8007.java
* @description TODO
*/
@SpringBootApplication
@EnableDiscoveryClient
public class OrderMain8007 {
public static void main(String[] args) {
SpringApplication.run(OrderMain8007.class, args);
}
}
⑤、注入RestTemplate
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 17:03
* @projectName SpringCloudDemo
* @className ApplicationContextConfig.java
* @description TODO
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
⑥、业务类
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 17:06
* @projectName SpringCloudDemo
* @className OrderController.java
* @description TODO
*/
@RestController
@Slf4j
public class OrderController {
@Resource
RestTemplate restTemplate;
private static final String INVOKE_URL = "http://localhost:8006";
@GetMapping(value = "/consumer/payment/consul")
public String paymentInfo() {
return restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class);
}
}
⑦、测试
5、集群
注意到我已经添加了
@LoadBalanced
,已经可以通过负载均衡依赖服务名从注册中心拉取服务URL
了,所以集群相当于也搭建成功,区别仅仅在于我只添加了一个服务而已,新增一个毫无疑问也是可以成功的。