环境 | 版本 |
---|---|
jdk | 1.8.0_201 |
maven | 3.6.0 |
Spring-boot | 2.2.4.RELEASE |
Spring-cloud | Hoxton.SR2 |
Consul | 1.4.5 |
consul是一套开源的分布式服务发现和配置管理系统,有HashiCorp公司用go语言开发;
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中,可以根据需要单独使用,也可以构建一个全方位的服务网络;
主要可以作为:
1、服务发现;
2、健康检查;
3、KV存储;
4、多数据中心;
更详细的可以查看spring 网站介绍https://spring.io/projects/spring-cloud-consul
当然,也可以通过官网查看https://www.consul.io/
再使用过程中,也可以参看《spring-cloud中文网》
为了简单方便的快速搭建,本次使用的consul,将使用docker搭建;如果需要使用其他的法式搭建,可以查看《consul的官网》下载对应操作系统的文件;
spring-cloud 版本使用的Hoxton.SR2
;对应的consul版本jar包为consul-api-1.4.1.jar
;docker下载的版本为1.4.5
;
如果在搭建过程中,出现一些报错信息,也可以检查下consul的jar包以及对应的版本的问题;
1、下载docker的consul镜像对应的版本;
docker pull consul:1.4.5
2、创建一个consul镜像的容器,并启动
docker run -d --name=dev-consul -e CONSUL_BIND_INTERFACE=eth0 -p 8500:8500 consul:1.4.5
3、查看consul容器启动情况
docker ps
具体的可以参考《docker-hub》;
4、查看consul的服务启动情况
访问网页http://localhost:8500;可以看到如下网站,就是正常启动了;
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.4.RELEASEversion>
<relativePath />
parent>
<groupId>com.badgergroupId>
<artifactId>badger-spring-cloud-consul-apiartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>badger-spring-cloud-consul-apiname>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<maven-jar-plugin.version>3.1.1maven-jar-plugin.version>
<spring-cloud.version>Hoxton.SR2spring-cloud.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulApiApplication {
@Value("${server.port}")
String port;
@Value("${spring.cloud.client.ip-address}")
String address;
@GetMapping("/consul/demo")
public String demo() {
return "我的地址是-->" + address + ":" + port;
}
public static void main(String[] args) {
SpringApplication.run(ConsulApiApplication.class, args);
}
}
@EnableDiscoveryClient
注解:是开启自动注册;
server:
port: 7000
spring:
application:
name: badger-spring-cloud-consul-api
cloud:
consul:
host: 127.0.0.1
port: 8500
discovery:
service-name: ${spring.application.name}
prefer-ip-address: true
更详细的配置内容可以参考 org.springframework.cloud.consul.ConsulProperties.class
以及org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties.class
这两个配置类的成员属性
当前案例,主要演示使用openfeign作为远程调用;单独使用ribbon调用就不再单独演示了;
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.4.RELEASEversion>
<relativePath />
parent>
<groupId>com.badgergroupId>
<artifactId>badger-spring-cloud-consul-openfeignartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>badger-spring-cloud-consul-openfeignname>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<maven-jar-plugin.version>3.1.1maven-jar-plugin.version>
<spring-cloud.version>Hoxton.SR2spring-cloud.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class ConsulOpenfeignApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(ConsulOpenfeignApplication.class, args);
}
}
需要加 @EnableDiscoveryClient
注解,把当前服务注册到注册中心中
/**
* feign接口 指定调用哪个接口
* 注解:@FeignClient 标注为feign接口 value 指向调用的模块名
* spring boot 2.0 只有一个服务端(value = "同一个名字"),只能写一个注解,
* 可以使用contextId 作为区分,而写多个@FeignClient
* @author liqi ,
*/
@FeignClient(value = "badger-spring-cloud-consul-api")
public interface DemoFeignApi {
@GetMapping("/consul/demo")
String demo();
}
使用consul作为注册中心,@FeignClient(value = "badger-spring-cloud-consul-api")
中,value属性,大小写都可以;
@RestController
public class DemoController {
@Autowired(required = false)
DemoFeignApi api;
@GetMapping("/consul/feign/demo")
public String demo() {
return api.demo();
}
}
server:
port: 8000
spring:
application:
name: badger-spring-cloud-consul-openfeign
cloud:
consul:
host: 127.0.0.1
port: 8500
discovery:
service-name: ${spring.application.name}
prefer-ip-address: true
服务的提供者badger-spring-cloud-consul-api
端口为7000;http://localhost:7000/consul/demo
访问结果:我的地址是-->172.16.2.54:7000
服务的调用者badger-spring-cloud-consul-openfeign
端口为8000;http://localhost:8000/consul/feign/demo
访问结果:我的地址是-->172.16.2.54:7000
如果需要负载均衡测试,那么服务提供者,使用不用的端口,多启动几个服务就可以了;
具体代码信息,可以查看《码云》