spring cloud深入學習(三)-----服務消費
在上一篇博文中簡單實現了eureka-server以及eureka-provider,後面會實現eureka-cosumer,現在針對eureka做進一步的詳解。
微服務整體架構
文字再美也沒有圖片直觀,下面通過一張圖來說明微服務的整體架構以及調用過程,如下:
服務註冊中心-1和服務註冊中心-2互相組成了高可用集群;
服務提供者啟動了兩個實例,一個註冊到服務註冊中心-1上,另外一個註冊到服務註冊中心-2上;
兩個服務消費者,也都分別指向了一個註冊中心。
服務提供者
1、服務註冊
服務提供者在啟動的時候發送rest請求將自己註冊到eureka-server上,包括自己的元數據,eureka-server會將相關數據存為兩層map,第一層的key為服務名,第二層的key則為具體服務的實例名。
2、服務同步
兩個服務提供者分別註冊到了兩個不同的服務註冊中心上,並且這兩個服務註冊中心互相註冊,因此當服務提供者發送註冊請求到一個服務註冊中心時,它會將該請求轉發到集群中相連的其他註冊中心,從而實現服務同步。
3、服務續約
當服務提供者註冊到服務註冊中心之後,服務提供者會維護一個心跳,需要定期的告訴註冊中心,我是有效的,沒有掛掉。否則不續約的話,註冊中心就會將服務提供者幹掉。
# 定義服務續約任務的調用間隔時間,默認30秒 eureka.instance.lease-renewal-interval-in-seconds=30 # 定義服務失效的時間,默認90秒 eureka.instance.lease-expiration-duration-in-seconds=90
服務消費者
在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務調用方式,一種是ribbon+restTemplate,另一種是feign。
1、ribbon
ribbon是一個負載均衡客戶端,可以很好的控制http和tcp的一些行為。Feign默認集成了ribbon。
2、新建一個eureka-consumer工程
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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ty</groupId> <artifactId>eureka-consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-consumer</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.1.1.RELEASE</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.RELEASE</version> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
運行主類:
package com.ty.eurekaconsumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient @SpringBootApplication public class EurekaConsumerApplication { public static void main(String[] args) { SpringApplication.run(EurekaConsumerApplication.class, args); } }
application.properties
# 服務名稱 spring.application.name=eureka-consumer # 端口號 server.port=3001 # 服務註冊中心地址 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
controller:
package com.ty.eurekaconsumer.controller; import com.ty.eurekaconsumer.service.RibbonService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class RibbonController { @Autowired RibbonService ribbonService; @GetMapping("/ribbonService") public String hi(@RequestParam String name) { return ribbonService.hiService( name ); } }
service:
package com.ty.eurekaconsumer.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.client.RestTemplate; @Service public class RibbonService { @Autowired private RestTemplate restTemplate; public String hiService(String name) { return restTemplate.getForObject("http://eureka-provider/firstCall?name="+name, String.class); } }
運行效果:
瀏覽器中輸入:http://localhost:3001/ribbonService?name=馬雲
本人已將eureka-server、eureka-provider、eureka-consumer代碼上傳到github中,地址如下:
eureka-server地址:https://github.com/ali-mayun/eureka-server
eureka-provider地址: https://github.com/ali-mayun/eureka-provider
eureka-consumer地址:https://github.com/ali-mayun/eureka-consumer
有需要的可以自行下載,另外方便的話,給個小星星哦!!!
spring cloud深入學習(三)-----服務消費