上一篇:springCloud微服务—初识服务注册中心之Eureka
<spring-cloud.version>Hoxton.SR8</spring-cloud.version> <spring-boot.version>2.3.0.RELEASE</spring-boot.version>
1.何为spring Cloud Consul
springCloud Consul为spring boot应用提供了Consul支持,Consul即可作为注册中心使用,也可作为配置中心使用。consul是一个服务网络(微服务间的tpc/ip,负责服务之间的网络调用,限流,熔断和监控)解决方案,它是一个一个分布式的,高可用的系统,而且开发使用简单,提供了功能齐全的控制平面,主要特点是:服务发现、健康检查,键值存储,安全服务通信,多数据中心。与其他分布式服务注册发现方案相比,consul的方案更“一站式”:内置了服务注册和发现,分布式一致性协议实现,健康检查,键值存储,多数据中心方案,不需要依赖其他工具,consul本身使用go语音开发,具有跨平台,运行高效等特点,方便。
- service discovery:consul通过DNS或HTTP接口使服务注册和发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
- health checking:健康检测使consul可以快速的告警在集群中的操作和服务发现的集成,可以防止服务转发到故障的服务上面。
- key/value storage:一个用来存储动态配置的系统,提供简单的http接口,可以在任何地方操作。
- multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
2.安装Consul
2.1、下载安装consul:Consul官网
consul可通过命令或者配置文件的方式来修改一些启动参数;我们首先看一下consul的一些端口;consul最多需要6个不同的端口才能正常工作,使用tcp,udp协议:
- 服务器RPC(默认8300):由服务器用来处理来自其他代理的传入请求,仅限TCP。
- Serf LAN(默认8301):用来处理局域网,所有的代理都需要,TCP和UDP。
- Serf WAN(默认8302):被服务器用来在WAN上到其他服务器。
- HTTP API(默认8500):被客户段用来与HTTP API交谈,TCP;
- DNS接口(默认8600):用来解析DNS查询,TCP和UDP。
2.2、下载zip文件后解压;然后通过黑窗口进入到我们解压目录:
2.3、 我们通过命令行启动开发模式:
consul agent -dev
2.4、访问地址http://localhost:8500/
3.创建生产者和消费者服务
springcloud-demo //父工程
|—springcloud-demo-consulprovider //生产者
|—springcloud-demo-consulconsumer //消费者
3.1、 springcloud-demo-consulprovider配置:
pom.xml
<?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>springcloud-demo</artifactId>
<groupId>com.qizh.springclouddemo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-demo-consulprovider</artifactId>
<dependencies>
<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.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8001
servlet:
context-path: /pringcloud-demo-consulprovider
spring:
application:
name: pringcloud-demo-consulprovider
cloud:
#consul 配置 注册中心地址
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
#心跳机制
heartbeat:
enabled: true
启动类:
package com.qizh.springclouddemo.consulprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @ProjectName: springclouddemo
* @ClassName: ConsulproviderApplication
* @Description: 启动类
* @Author: 86157
* @Date: 2022/5/25 20:39
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulproviderApplication {
public static void main(String[] args){
SpringApplication.run(ConsulproviderApplication.class);
}
}
编写测试类
package com.qizh.springclouddemo.consulprovider.common.controllers;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
/**
* @ProjectName: springclouddemo
* @ClassName: TestController
* @Description: 测试类
* @Author: 86157
* @Date: 2022/5/25 20:46
*/
@RestController
public class TestController {
@RequestMapping(value = "/ping")
public String ping(){
return "success";
}
}
启动项目然后访问测试接口:http://localhost:8001/pringcloud-demo-consulprovider/ping
consul可以看到服务正常注册了;
3.2、创建消费者:springcloud-demo-consulconsumer 配置:
pom.xml
<?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>springcloud-demo</artifactId>
<groupId>com.qizh.springclouddemo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-demo-consulconsumer</artifactId>
<dependencies>
<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.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8002
servlet:
context-path: /pringcloud-demo-consulconsumer
spring:
application:
name: pringcloud-demo-consulconsumer
cloud:
#consul 配置 注册中心地址
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
#心跳机制
heartbeat:
enabled: true
启动类:
package com.qizh.springclouddemo.consulconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @ProjectName: springclouddemo
* @ClassName: ConsulconsumerApplication
* @Description: TODO(一句话描述该类的功能)
* @Author: 86157
* @Date: 2022/5/25 21:01
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulconsumerApplication {
public static void main(String[] args){
SpringApplication.run(ConsulconsumerApplication.class);
}
@Bean
@LoadBalanced //resttemplate的负载均衡能力
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
测试类
package com.qizh.springclouddemo.consulconsumer.common.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @ProjectName: springclouddemo
* @ClassName: ConsumerTestController
* @Description: 测试类
* @Author: 86157
* @Date: 2022/5/25 21:04
*/
@RestController
public class ConsumerTestController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/ping")
public String consumerPing(){
return restTemplate.getForObject("http://pringcloud-demo-consulprovider/pringcloud-demo-consulprovider/ping",String.class);
}
}
访问测试类http://localhost:8002/pringcloud-demo-consulconsumer/ping
访问consul可以看到两个服务正常注册:
可以看出我们调用过程不再是使用了具体的地址去调用了生产者;而是通过注册到注册中心的service-name找到对应的服务;