介绍
在Springcloud中目前常用的注册中心组建有3个,Eureka前面我们已经介绍过了,这篇文章我们介绍Consul。Consul是HashiCorp公司推出来的开源产品。主要提供了:服务发现、服务隔离、服务配置等功能。相比于Eureka和Zookeeper,Consul配置更加一站式,因为内置了很多微服务常见的需求:服务发现与注册、分布式一致性协议实现、健康检查、键值对储存、多数据中心等,我们不需要借助第三方组件实现这些功能。
安装
不同与Eureka,Consul使用Go语言开发,所以,使用Consul,我们需要安装软件。我们这里安装采用Linux。Windows安装相对简单下载地址,下载安装即可。
1.执行下面命令下载
wget https://releases.hashicorp.com/consul/1.7.2/consul_1.7.2_linux_amd64.zip
2.解压
unzip consul_1.7.2_linux_amd64.zip
3.启动
./consul agent -dev -ui -node=consul-dev -client=0.0.0.0
注意:如果是服务器需要在安全组里开启端口8500,不然访问不到。
6.输入http://ip:8500访问
使用
服务提供者
创建一个springboot项目
1.依赖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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dpf</groupId>
<artifactId>consul-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consul-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.启动类添加注解
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulProviderApplication.class, args);
}
}
3.配置application.yml
spring:
application:
name: consul-provider
cloud:
consul:
host: 你的consul安装的地址,本地填写localhost
port: 8500
discovery:
service-name: consul-provider
server:
port: 2000
- spring.cloud.consul.host:安装consul的主机地址
- spring.cloud.consul.port:consul端口号默认为8500
- spring.cloud.consul.discovery.service-name:注册到consul的服务名称,后期客户端会根据这个名称来进行服务调用。
- spring.cloud.consul.discovery.register=false 不注册到consul中。客户端可以设置注册到 Consul 中,也可以不注册到 Consul 注册中心中,根据我们的业务来选择,只需要在使用服务时通过 Consul 对外提供的接口获取服务信息即可。
4.controller
@RestController
public class HelloController {
@Value("${server.port}")
Integer port;
@GetMapping("/hello")
public String hello(){
return "hello"+port;
}
}
5.集群注册
将该项目打包,打包成功后执行如下命令
java -jar consul-provider-0.0.1-SNAPSHOT.jar --server.port=2000
java -jar consul-provider-0.0.1-SNAPSHOT.jar --server.port=2001
启动成功后,再去consul页面就可以看到两个实例了
服务消费者
1.依赖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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dpf</groupId>
<artifactId>consul-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consul-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.启动类添加注解
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulConsumerApplication.class, args);
}
/**
* 用于服务间调用
* @return
*/
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.配置application.yml
spring:
application:
name: consul-consumer
cloud:
consul:
host: consul安装的ip
port: 8500
discovery:
service-name: consul-consumer
server:
port: 2003
4.controller
@RestController
public class HelloController {
@Autowired
LoadBalancerClient loadBalancerClient;
@Autowired
RestTemplate restTemplate;
@GetMapping("/hello")
public void hello(){
ServiceInstance choose = loadBalancerClient.choose("consul-provider");
System.out.println(choose);
System.out.println(choose.getUri());
System.out.println(choose.getHost());
String forObject = restTemplate.getForObject(choose.getUri() + "/hello", String.class);
System.out.println(forObject);
}
}