服務治理是微服務架構中最爲核心的基礎模塊,主要用來實現各個微服務實例的自動化註冊和發現; 在微服務最開始的時候,服務並很少,咱們能夠經過靜態配置來完成服務間的調用;若A服務調用B服務,對B服務作了HA,咱們能夠手動維護一份B實例的清單, 當B服務某些實例不可用,還能夠手動去清除部分不可用的實例;但隨着業務的發展,須要維護的B實例愈來愈多,系統功能也愈來愈複雜,維護難度可想而知;並且相同 服務不一樣實例極可能會命名衝突,配置衝突等,如port; 所以咱們須要一個服務治理框架和產品,來對不一樣服務的多個實例進行自動化的維護; 目前服務治理框架有Netflix的Eureka,alibaba的Dubbo等,這些框架的實現都圍繞着服務註冊與服務發現機制來完成對微服務應用實例的自動化管理;
咱們使用project-module的形式建立項目; 咱們建立一個CloudServer的項目,html
<?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"> <modelVersion>4.0.0</modelVersion> <groupId>com.river</groupId> <artifactId>CloudServer</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <swaggger2.version>2.2.2</swaggger2.version> </properties> <!--依賴管理,用於統一管理整個項目依賴的版本等--> <dependencyManagement> <dependencies> <!--swagger的依賴,用於自動化接口列表,可刪除--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swaggger2.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swaggger2.version}</version> </dependency> <!--swagger--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!--導入依賴的包,省略version--> <dependencies> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency> <!--一個springboot的監控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
下面咱們添加一個EurekaServer的module模塊,做爲Eureka註冊中心;java
<?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>CloudServer</artifactId> <groupId>com.river</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>EurekaServer</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!-- spring boot test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
配置文件application.yamlweb
server: port: 8761 #端口號 eureka: instance: hostname: localhost home-page-url: swagger-ui.html client: register-with-eureka: false #是否向註冊中心註冊,這裏因爲本身就是註冊中心,所以爲false; fetch-registry: false #檢索服務,因爲本身在維護服務實例,所以無需檢索服務,故false; service-url: defaultZone: http://localhost:8761/eureka/ server: enable-self-preservation: false spring: application: name: eureka-server #應用名
此時添加springboot啓動類spring
package com.river.eureka.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer //啓動一個服務註冊中心,與其餘服務進行對話; @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class,args); } }
此時咱們啓動啓動類,而後訪問localhost:8761,會看到Eureka服務實例列表頁,可是在Instances一欄爲空,由於咱們沒有服務實例註冊在Eureka上;apache
咱們在新建一個名字爲ApplicationClientOne的module;springboot
<?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>CloudServer</artifactId> <groupId>com.river</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ApplicationClientOne</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> </project>
配置application.yaml;架構
server: port: 9001 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ register-with-eureka: true fetch-registry: true spring: application: name: applicationClient
添加啓動類:app
package com.river.application.one; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient //說明這是一個客戶端,與@EnableDiscoveryClient註解做用相同 @SpringBootApplication public class ApplicationClientOne { public static void main(String[] args) { SpringApplication.run(ApplicationClientOne.class,args); } }
說明: @EnableEurekaClient: @EnableDiscoveryClient: 在springcloud中的服務治理discovery service能夠有多種實現(eureka,consul,zookeeper等),後者來自於spring-cloud-commons包,能夠支持不一樣的服務治理插件; 而前者來自於eureka,只支持eureka;框架
啓動客戶端項目,查看日誌能夠發現:maven
2018-07-31 10:40:40.558 INFO 11296 --- [nio-8761-exec-2] c.n.e.registry.AbstractInstanceRegistry : Registered instance APPLICATIONCLIENT/PC-HEPENGFEI.ppmoney.com:applicationClient:9001 with status UP (replication=false)
在Eureka的服務實例列表中能夠看到咱們的這個實例;
#Eureka服務發現
服務治理是微服務架構中最爲核心的基礎模塊,主要用來實現各個微服務實例的自動化註冊和發現; 在微服務最開始的時候,服務並很少,咱們能夠經過靜態配置來完成服務間的調用;若A服務調用B服務,對B服務作了HA,咱們能夠手動維護一份B實例的清單, 當B服務某些實例不可用,還能夠手動去清除部分不可用的實例;但隨着業務的發展,須要維護的B實例愈來愈多,系統功能也愈來愈複雜,維護難度可想而知;並且相同 服務不一樣實例極可能會命名衝突,配置衝突等,如port; 所以咱們須要一個服務治理框架和產品,來對不一樣服務的多個實例進行自動化的維護; 目前服務治理框架有Netflix的Eureka,alibaba的Dubbo等,這些框架的實現都圍繞着服務註冊與服務發現機制來完成對微服務應用實例的自動化管理;
咱們使用project-module的形式建立項目; 咱們建立一個CloudServer的項目,
<?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"> <modelVersion>4.0.0</modelVersion> <groupId>com.river</groupId> <artifactId>CloudServer</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <swaggger2.version>2.2.2</swaggger2.version> </properties> <!--依賴管理,用於統一管理整個項目依賴的版本等--> <dependencyManagement> <dependencies> <!--swagger的依賴,用於自動化接口列表,可刪除--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swaggger2.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swaggger2.version}</version> </dependency> <!--swagger--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!--導入依賴的包,省略version--> <dependencies> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency> <!--一個springboot的監控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
下面咱們添加一個EurekaServer的module模塊,做爲Eureka註冊中心;
<?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>CloudServer</artifactId> <groupId>com.river</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>EurekaServer</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!-- spring boot test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
配置文件application.yaml
server: port: 8761 #端口號 eureka: instance: hostname: localhost home-page-url: swagger-ui.html client: register-with-eureka: false #是否向註冊中心註冊,這裏因爲本身就是註冊中心,所以爲false; fetch-registry: false #檢索服務,因爲本身在維護服務實例,所以無需檢索服務,故false; service-url: defaultZone: http://localhost:8761/eureka/ server: enable-self-preservation: false spring: application: name: eureka-server #應用名
此時添加springboot啓動類
package com.river.eureka.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer //啓動一個服務註冊中心,與其餘服務進行對話; @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class,args); } }
此時咱們啓動啓動類,而後訪問localhost:8761,會看到Eureka服務實例列表頁,可是在Instances一欄爲空,由於咱們沒有服務實例註冊在Eureka上;
咱們在新建一個名字爲ApplicationClientOne的module;
<?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>CloudServer</artifactId> <groupId>com.river</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ApplicationClientOne</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> </project>
配置application.yaml;
server: port: 9001 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ register-with-eureka: true fetch-registry: true spring: application: name: applicationClient
添加啓動類:
package com.river.application.one; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient //說明這是一個客戶端,與@EnableDiscoveryClient註解做用相同 @SpringBootApplication public class ApplicationClientOne { public static void main(String[] args) { SpringApplication.run(ApplicationClientOne.class,args); } }
說明: @EnableEurekaClient:
@EnableDiscoveryClient:
在springcloud中的服務治理discovery service能夠有多種實現(eureka,consul,zookeeper等),後者來自於spring-cloud-commons包,能夠支持不一樣的服務治理插件; 而前者來自於eureka,只支持eureka;
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @EnableDiscoveryClient public @interface EnableEurekaClient { }
啓動客戶端項目,查看日誌能夠發現:
2018-07-31 10:40:40.558 INFO 11296 --- [nio-8761-exec-2] c.n.e.registry.AbstractInstanceRegistry : Registered instance APPLICATIONCLIENT/PC-HEPENGFEI.ppmoney.com:applicationClient:9001 with status UP (replication=false)
在Eureka的服務實例列表中能夠看到咱們的這個實例;