天天看點

spring cloud搭建微服務second-fiberhome(二):結合consul實作服務注冊與服務發現

spring cloud官方耦合度最好的服務注冊于服務發現是eureka。但是在實際應用中,consul服務既能結合spring cloud又能結合其他服務進行服務注冊與服務發現,同時功能點強于eureka,對于consul與eureka的優缺點,在此不做介紹。下文使用consul結合spring cloud進行服務注冊與服務發現。

consul安裝包:consul_0_windows_amd64.zip
系統環境:win7
注:本文其他開發環境見上篇,在此略過
           

1.consul部署

consul既可以單節點使用,也可以進行叢集部署,聽過算法raft保持叢集各節點一緻性。在這裡隻是用consul單節點進行spring cloud的服務注冊與服務發現應用。

  1. 解壓consul_0.8.3_windows_amd64.zip,得到consul.exe
  2. 将consul.exe拷貝到D:\Program Files\consul(consul檔案夾不存在則建立)下,然後在環境變量中配置PATH路徑:D:\Program Files\consul
  3. 測試consul是否配置成功
    spring cloud搭建微服務second-fiberhome(二):結合consul實作服務注冊與服務發現
  4. win7啟動consul

    打開cmd,輸入consul agent -dev

    spring cloud搭建微服務second-fiberhome(二):結合consul實作服務注冊與服務發現
    界面:localhost:8500(consul預設端口為8500)
    spring cloud搭建微服務second-fiberhome(二):結合consul實作服務注冊與服務發現

2.建立second-consul-server-1(2)服務

該工程作為server進行consul的注冊server端。

1)在eclipse下建立maven工程second-consul-server-1(2),修改pom.xml。如下:
<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">
 <modelVersion>4.0.0</modelVersion>

 <parent>
  <groupId>com.fiberhome</groupId>
  <artifactId>second-fiberhome</artifactId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>

 <artifactId>second-consul-server-1</artifactId>
 <packaging>jar</packaging>

 <name>second-consul-server-1</name>
 <url>http://maven.apache.org</url>

 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  </dependency>
 </dependencies>

 <dependencyManagement>
  <dependencies>
   <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-consul-dependencies</artifactId>
    <version>1.0.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
   </dependency>
  </dependencies>
 </dependencyManagement>
</project>
           

注:對于spring boot服務做健康檢查,需要依賴actuator,該依賴在父類工程second-fiberhome中進行了配置,見spring-boot-starter-actuator。

2)在src/main/resources下,建立application.properties。
server.port=
spring.application.name=consul-server

spring.cloud.consul.host=
spring.cloud.consul.port=
spring.cloud.consul.discovery.enabled=true
spring.cloud.consul.discovery.instance-id=consul-server-
spring.cloud.consul.discovery.hostname=localhost
spring.cloud.consul.discovery.port=${server.port}
spring.cloud.consul.discovery.serviceName=consul-server
spring.cloud.consul.discovery.healthCheckUrl=http://:${server.port}/health
spring.cloud.consul.discovery.healthCheckInterval=s
spring.cloud.consul.discovery.tags=dev
           

注:spring.cloud.consul.discovery.serviceName=consul-server下,可以通過consul服務發現調用consul-server進行通路second-consul-server1(2)服務,需要注意的是類似consul-server使用下劃線無效,會轉化為“-”,從consul界面可以發現該情況。

3)在src/main/java下建立啟動類ConsulServerApplication.java
package com.fiberhome;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulServerApplication {

 public static void main(String[] args) {
  SpringApplication.run(ConsulServerApplication.class, args);
 }
}
           

注:需要在啟動類上添加注解@EnableDiscoveryClient

4)啟動second-consul-server-1(2)和consul

啟動成功後,通路localhost:8500,界面如下:

spring cloud搭建微服務second-fiberhome(二):結合consul實作服務注冊與服務發現

3.建立second-consul-client服務

通過second-consul-client結合consul,進行服務發現通路。

1)建立maven工程second-consul-client,配置consul,并進行通路second-consul-server服務。pom.xml如下:
<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">
 <modelVersion>4.0.0</modelVersion>

 <parent>
  <groupId>com.fiberhome</groupId>
  <artifactId>second-fiberhome</artifactId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>

 <artifactId>second-consul-client</artifactId>
 <packaging>jar</packaging>

 <name>second-consul-client</name>
 <url>http://maven.apache.org</url>

 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  </dependency>
 </dependencies>

 <dependencyManagement>
  <dependencies>
   <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-consul-dependencies</artifactId>
    <version>1.0.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
   </dependency>
  </dependencies>
 </dependencyManagement>
</project>
           

注:主要使用spring-cloud-starter-consul-discovery依賴。

2)建立application.properties配置檔案,引入consul配置。
server.port=

spring.cloud.consul.host=
spring.cloud.consul.port=
spring.cloud.consul.discovery.instance-id=consul-client
spring.cloud.consul.discovery.hostname=localhost
spring.cloud.consul.discovery.serviceName=consul-client
spring.cloud.consul.discovery.healthCheckUrl=http://:${server.port}/health
spring.cloud.consul.discovery.healthCheckInterval=s
spring.cloud.consul.discovery.tags=dev
spring.cloud.consul.discovery.enabled=true
spring.cloud.consul.discovery.port=${server.port}
           
3)建立com.fiberhome.web包,建立ClientController.java,引入對consul-server通路。如下:
package com.fiberhome.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ClientController {

 @Autowired
 public DiscoveryClient discoveryClient;

 @Autowired
 public LoadBalancerClient loadBalancer;

 @RequestMapping(value="/services",method=RequestMethod.GET)
 public Object services(){
  return discoveryClient.getInstances("consul-server");
 }

 @RequestMapping("/discovery")
 public Object discovery(){
  return loadBalancer.choose("consul-server").getUri().toString();
 }
}
           

注:spring-cloud-starter-consul-discovery依賴包含了負載均衡和服務發現的類,用以通路consul服務。

package com.fiberhome;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulClientApplication {

 public static void main(String[] args) {
  SpringApplication.run(ConsulClientApplication.class, args);
 }

}
           
4)啟動三個服務:
second-consul-server-
second-consul-server-
second-consul-client
           

然後使用postman通路client服務,localhost:9990/services

spring cloud搭建微服務second-fiberhome(二):結合consul實作服務注冊與服務發現

通路localhost:9990/discovery

spring cloud搭建微服務second-fiberhome(二):結合consul實作服務注冊與服務發現

注意,由于采用的是兩個server服務,是以每次請求discovery擷取的結果是不同的,預設采用的是輪詢方式通路兩者服務,具有負載均衡的特點。

spring cloud搭建微服務second-fiberhome(二):結合consul實作服務注冊與服務發現

該工程源碼見github:https://github.com/moyu2012/second-fiberhome

繼續閱讀