1、小記
這段時間有空,把springcloud的知識整理一下,好記性不如爛筆頭,也讓自己對springcloud有個清晰的認識。此次的整理記錄主要借鑒了這位大佬的博客 https://blog.csdn.net/forezp,特此感謝。
這次學習的環境,使用idea+jdk8,springboot基於2.0.3版本
2、spring cloud簡介
spring cloud 為開發人員提供了快速構建分布式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分布式會話等等。
3、創建Maven主工程
創建成功之后,刪除src目錄,pom.xml引入依賴,其它module工程繼承該pom.xml,避免重復引入,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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.study</groupId> <artifactId>cloud</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> </parent> <modules> <module>eureka-server</module> <module>eureka-client</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </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>
4、eureka簡介
4.1、服務的注冊與發現圖例
4.2、簡介
Eureka是Spring Cloud Netflix微服務套件中的一部分,可以與Springboot構建的微服務很容易的整合起來。
Eureka包含了服務器端和客戶端組件。服務器端,也被稱作是服務注冊中心,用於提供服務的注冊與發現。Eureka支持高可用的配置,當集群中有分片出現故障時,Eureka就會轉入自動保護模式,它允許分片故障期間繼續提供服務的發現和注冊,
當故障分片恢復正常時,集群中其他分片會把他們的狀態再次同步回來。集群中的的不同服務注冊中心通過異步模式互相復制各自的狀態,這也意味着在給定的時間點每個實例關於所有服務的狀態可能存在不一致的現象。
客戶端組件包含服務消費者與服務生產者。在應用程序運行時,Eureka客戶端向注冊中心注冊自身提供的服務並周期性的發送心跳來更新它的服務租約。同時也可以從服務端查詢當前注冊的服務信息並把他們緩存到本地並周期性的刷新服務狀態。
5、創建model工程eureka-server作為服務注冊中心、eureka-client作為服務提供者
5.1、創建eureka-server
右鍵工程->創建model-> 選擇spring initialir 如下圖:
下一步->選擇cloud discovery->eureka server ,然后一直下一步就行了。
創建完成后,修改pom.xml文件依賴cloud父工程pom.xml文件,刪除重復依賴,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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.study</groupId> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka-server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>com.study</groupId> <artifactId>cloud</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> </project>
5.2、啟動服務注冊中心
只需要一個注解@EnableEurekaServer,這個注解需要在springboot工程的啟動application類上加:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
eureka是一個高可用的組件,它沒有后端緩存,每一個實例注冊之后需要向注冊中心發送心跳(因此可以在內存中完成),
在默認情況下erureka server也是一個eureka client ,必須要指定一個 server。eureka server的配置文件appication.yml,yml最大的好處在於其擁有天然的樹狀結構:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eurka-server
通過eureka.client.registerWithEureka:false和fetchRegistry:false來表明自己是一個eureka server.
5.3、訪問eureka-server界面
啟動工程,打開瀏覽器訪問: http://localhost:8761 ,界面如下:
No instances available 表示沒有服務被發現
6、創建服務提供者eureka-client
當client向server注冊時,它會提供一些元數據,例如主機和端口,URL,主頁等。服務注冊在Eureka上並且每30秒發送心跳來續租。如果一個客戶端在3次內沒有刷新心跳,它將在大約90秒內被移出服務器注冊表。
注冊信息和更新信息會在整個eureka集群的節點進行復制。任何分區的客戶端都可查找注冊中心信息(每30秒發生一次)來定位他們的服務(可能會在任何分區)並進行遠程調用。
創建過程同server類似,創建完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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.study</groupId> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka-server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>com.study</groupId> <artifactId>cloud</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
通過注解@EnableEurekaClient 表明自己是一個eurekaclient.
@RestController @EnableEurekaClient @SpringBootApplication public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } @Value("${server.port}") String port; @RequestMapping("/hi") public String home(@RequestParam(value = "name", defaultValue = "study") String name) { return "hi " + name + " ,i am from port:" + port; } }
在配置文件中配置自己的服務注冊中心地址,定義當前服務的名稱。
server:
port: 8762
spring:
application:
name: service-hi
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
啟動工程,刷新http://localhost:8761 地址,服務名為SERVICE-HI ,端口為7862的服務已經注冊到服務列表中了
打開 http://localhost:8762/hi?name=study ,你會在瀏覽器上看到 :
hi study ,i am from port:8762