spring-cloud Hoxton.SR2版 服務註冊與發現–consul搭建以及遠程調用(openfeign)使用
文章目錄
- spring-cloud Hoxton.SR2版 服務註冊與發現--consul搭建以及遠程調用(openfeign)使用
- 1、consul的簡介以及搭建
- 2、項目搭建--服務的提供者badger-spring-cloud-consul-api
- 2.1、maven的pom文件如下:主要spring-cloud-starter-consul-discovery這個包
- 2.2、springboot主類,以及controller請求;如下
- 2.3、application.yml配置文件如下
- 3、項目搭建--服務的調用者badger-spring-cloud-consul-openfeign
- 3.1、maven的pom文件如下:同樣需要spring-cloud-starter-consul-discovery這個包
- 3.2、springboot主類如下
- 3.3、openFeign遠程調用的接口
- 3.4、controller業務類
- 3.5、application.yml配置文件如下
- 4、測試
本地項目的基礎環境
環境 | 版本 |
---|---|
jdk | 1.8.0_201 |
maven | 3.6.0 |
Spring-boot | 2.2.4.RELEASE |
Spring-cloud | Hoxton.SR2 |
Consul | 1.4.5 |
1、consul的簡介以及搭建
1.1、consul簡介
consul是一套開源的分佈式服務發現和配置管理系統,有HashiCorp公司用go語言開發;
提供了微服務系統中的服務治理、配置中心、控制總線等功能。這些功能中,可以根據需要單獨使用,也可以構建一個全方位的服務網絡;
主要可以作爲:
1、服務發現;
2、健康檢查;
3、KV存儲;
4、多數據中心;
更詳細的可以查看spring 網站介紹https://spring.io/projects/spring-cloud-consul
當然,也可以通過官網查看https://www.consul.io/
再使用過程中,也可以參看《spring-cloud中文網》
1.2、docker搭建
爲了簡單方便的快速搭建,本次使用的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;可以看到如下網站,就是正常啓動了;
2、項目搭建–服務的提供者badger-spring-cloud-consul-api
2.1、maven的pom文件如下:主要spring-cloud-starter-consul-discovery這個包
<?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.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.badger</groupId>
<artifactId>badger-spring-cloud-consul-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>badger-spring-cloud-consul-api</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-cloud.version>Hoxton.SR2</spring-cloud.version>
</properties>
<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>
<dependencies>
<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.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2、springboot主類,以及controller請求;如下
@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
註解:是開啓自動註冊;
2.3、application.yml配置文件如下
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
這兩個配置類的成員屬性
3、項目搭建–服務的調用者badger-spring-cloud-consul-openfeign
3.1、maven的pom文件如下:同樣需要spring-cloud-starter-consul-discovery這個包
當前案例,主要演示使用openfeign作爲遠程調用;單獨使用ribbon調用就不再單獨演示了;
<?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.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.badger</groupId>
<artifactId>badger-spring-cloud-consul-openfeign</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>badger-spring-cloud-consul-openfeign</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-cloud.version>Hoxton.SR2</spring-cloud.version>
</properties>
<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>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</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-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-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.2、springboot主類如下
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class ConsulOpenfeignApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(ConsulOpenfeignApplication.class, args);
}
}
需要加 @EnableDiscoveryClient
註解,把當前服務註冊到註冊中心中
3.3、openFeign遠程調用的接口
/**
* 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屬性,大小寫都可以;
3.4、controller業務類
@RestController
public class DemoController {
@Autowired(required = false)
DemoFeignApi api;
@GetMapping("/consul/feign/demo")
public String demo() {
return api.demo();
}
}
3.5、application.yml配置文件如下
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
4、測試
1、啓動應用服務的提供者badger-spring-cloud-consul-api
端口爲7000;
http://localhost:7000/consul/demo
訪問結果:我的地址是-->172.16.2.54:7000
2、啓動應用服務的調用者badger-spring-cloud-consul-openfeign
端口爲8000;
http://localhost:8000/consul/feign/demo
訪問結果:我的地址是-->172.16.2.54:7000
如果需要負載均衡測試,那麼服務提供者,使用不用的端口,多啓動幾個服務就可以了;
具體代碼信息,可以查看《碼雲》