您好,登錄后才能下訂單哦!
這篇文章主要介紹“基于Spring Cloud的微服務架構怎么使用”,在日常操作中,相信很多人在基于Spring Cloud的微服務架構怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于Spring Cloud的微服務架構怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
微服務是可以獨立部署、水平擴展、獨立訪問(或者有獨立的數據庫)的服務單元,Spring Cloud則是用來管理微服務的一系列框架的有序集合。利用Spring Boot的開發便利性,Spring Cloud巧妙簡化了分布式系統基礎設施的開發,例如服務發現注冊、配置中心、消息總線、負載均衡、斷路器等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。
Spring Cloud并沒有重復造輪子,而是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝,屏蔽掉了復雜的配置和實現原理,最終為開發者提供了一套簡單易懂、易部署、易維護的分布式系統開發工具包。
Spring Cloud有很多組件,其中最核心的組件有:Eureka(注冊中心)、Hystrix(斷路器)、Config(配置中心)、Zuul(代理、網關)等等。
接下來,我們不妨通過幾個demo來了解Spring Cloud是如何一步步構建起來的。
示例源碼請戳源碼
如何搭建Eureka
如何搭建Hystrix
如何搭建Config
如何搭建Zuul
注冊中心Eureka是一個基于REST的服務,用于各個服務之間的互相發現。任何服務需要其它服務的支持都需要通過它獲取;同樣的,所有的服務都需要來這里注冊,方便以后其它服務來調用。Eureka的好處是你不需要知道找什么服務,只需要到注冊中心來獲取,也不需要知道提供支持的服務在哪里、是幾個服務來支持的,直接來這里獲取就可以了。如此一來,便提升了穩定性,也降低了微服務架構搭建的難度。
正常調用服務A請求服務B:
<div align=center> <img src="https://cache.yisu.com/upload/information/20210523/355/689883.png" width="50%" height="50%"> </div>
有了服務中心之后,服務A不能直接調用服務B,而是A,B通過在注冊中心中注冊服務,然后互相發現,服務A通過注冊中心來調用服務B:
<div align=center> <img src="https://cache.yisu.com/upload/information/20210523/355/689884.png" width="75%" height="75%"> </div>
以上只是2個服務之間的相互調用,如果有十幾個甚至幾十個服務,其中任何的一個項目改動,就可能牽連到好幾個項目的重啟,很麻煩而且容易出錯。通過注冊中心來獲取服務,你不需要關注你調用的項目IP地址,由幾臺服務器組成,每次直接去注冊中心獲取可以使用的服務去調用既可。
1、pom中添加依賴
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
2、添加啟動代碼中添加@EnableEurekaServer
注解
@SpringBootApplication @EnableEurekaServer public class SpringCloudEurekaApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudEurekaApplication.class, args); } }
3、配置文件
在默認設置下,該服務注冊中心也會將自己作為客戶端來嘗試注冊它自己,所以我們需要禁用它的客戶端注冊行為,在application.properties
添加以下配置:
spring.application.name=spring-cloud-eureka server.port=8000 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
eureka.client.register-with-eureka
:表示是否將自己注冊到Eureka Server,默認為true。
eureka.client.fetch-registry
:表示是否從Eureka Server獲取注冊信息,默認為true。
eureka.client.serviceUrl.defaultZone
:設置與Eureka Server交互的地址,查詢服務和注冊服務都需要依賴這個地址。默認是http://localhost:8761/eureka ;多個地址可使用 , 分隔。
啟動工程后,訪問:http://localhost:8000/,可以看到下面的頁面,其中還沒有發現任何服務
<div align=center> <img src="https://cache.yisu.com/upload/information/20210523/355/689885.png" width="100%" height="100%"> </div>
1、pom包配置
創建一個springboot項目,pom.xml中添加如下配置:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
2、配置文件
application.properties配置如下:
spring.application.name=spring-cloud-producer server.port=9000 eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
3、啟動類
啟動類中添加@EnableDiscoveryClient
注解
@SpringBootApplication @EnableDiscoveryClient public class ProducerApplication { public static void main(String[] args) { SpringApplication.run(ProducerApplication.class, args); } }
4、服務提供
提供hello服務:
@RestController public class HelloController { @RequestMapping("/hello") public String index(@RequestParam String name) { return "hello "+name+",this is first messge"; } }
添加@EnableDiscoveryClient
注解后,項目就具有了服務注冊的功能。啟動工程后,就可以在注冊中心的頁面看到SPRING-CLOUD-PRODUCER服務。
<div align=center> <img src="https://cache.yisu.com/upload/information/20210523/355/689886.png" width="100%" height="100%"> </div>
到此服務提供者配置就完成了。
1、pom包配置
和服務提供者一致
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
2、配置文件
application.properties配置如下:
spring.application.name=spring-cloud-consumer server.port=9001 eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
3、啟動類
啟動類添加@EnableDiscoveryClient
和@EnableFeignClients
注解:
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
@EnableDiscoveryClient
:啟用服務注冊與發現
@EnableFeignClients
:啟用feign進行遠程調用
Feign是一個聲明式Web Service客戶端。使用Feign能讓編寫Web Service客戶端更加簡單, 它的使用方法是定義一個接口,然后在上面添加注解,同時也支持JAX-RS標準的注解。Feign也支持可拔插式的編碼器和解碼器。Spring Cloud對Feign進行了封裝,使其支持了Spring MVC標準注解和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支持負載均衡。
4、feign調用實現
@FeignClient(name= "spring-cloud-producer") public interface HelloRemote { @RequestMapping(value = "/hello") public String hello(@RequestParam(value = "name") String name); }
name:遠程服務名,及spring.application.name配置的名稱
此類中的方法和遠程服務中contoller中的方法名和參數需保持一致。
5、web層調用遠程服務
將HelloRemote注入到controller層,像普通方法一樣去調用即可。
@RestController public class ConsumerController { @Autowired HelloRemote HelloRemote; @RequestMapping("/hello/{name}") public String index(@PathVariable("name") String name) { return HelloRemote.hello(name); } }
到此,最簡單的一個服務注冊與調用的例子就完成了。
依次啟動spring-cloud-eureka、spring-cloud-producer、spring-cloud-consumer三個項目。
先輸入:http://localhost:9000/hello?name=neo
檢查spring-cloud-producer服務是否正常
返回:hello neo,this is first messge
說明spring-cloud-producer正常啟動,提供的服務也正常。
瀏覽器中輸入:http://localhost:9001/hello/neo
返回:hello neo,this is first messge
說明客戶端已經成功的通過feign調用了遠程服務hello,并且將結果返回到了瀏覽器。
{{site.data.alerts.callout_danger}} 部署在云幫,需要驗證必須保證一下3點:<br>
端口開啟了外部訪問
功能<br>
consumer關聯了producer<br>
hello?name=neo
和hello/neo
添加在訪問
所產生的url后<br>
之后組件的驗證同理。
在微服務架構中通常會有多個服務層調用,基礎服務的故障可能會導致級聯故障,進而造成整個系統不可用的情況,這種現象被稱為服務雪崩效應。而使用Hystrix(熔斷器)就可以避免這種問題。
熔斷器的原理很簡單,如同電力過載保護器。它可以實現快速失敗,如果它在一段時間內偵測到許多類似的錯誤,會強迫其以后的多個調用快速失敗,不再訪問遠程服務器,從而防止應用程序不斷地嘗試執行可能會失敗的操作,使得應用程序繼續執行而不用等待修正錯誤,或者浪費CPU時間去等到長時間的超時產生。熔斷器也可以使應用程序能夠診斷錯誤是否已經修正,如果已經修正,應用程序會再次嘗試調用操作。
當Hystrix Command請求后端服務失敗數量超過一定比例(默認50%), 斷路器會切換到開路狀態(Open). 這時所有請求會直接失敗而不會發送到后端服務. 斷路器保持在開路狀態一段時間后(默認5秒), 自動切換到半開路狀態(HALF-OPEN). 這時會判斷下一次請求的返回情況, 如果請求成功, 斷路器切回閉路狀態(CLOSED), 否則重新切換到開路狀態(OPEN). Hystrix的斷路器就像我們家庭電路中的保險絲, 一旦后端服務不可用, 斷路器會直接切斷請求鏈, 避免發送大量無效請求影響系統吞吐量, 并且斷路器有自我檢測并恢復的能力。
<div align=center> <img src="https://cache.yisu.com/upload/information/20210523/355/689887.png" width="50%" height="50%"> </div>
通過將Hystrix組件添加到服務消費者,實現熔斷效果,只需要在Eureka的demo基礎加入Hystrix即可。
<div align=center> <img src="https://cache.yisu.com/upload/information/20210523/355/689888.png" width="50%" height="50%"> </div>
Hystrix是作用在服務調用端的,因此需要添加在A上。
因為熔斷只是作用在服務調用這一端,因此我們根據上一篇的示例代碼只需要改動消費者(A)服務相關代碼就可以。因為,Feign中已經依賴了Hystrix所以在maven配置上不用做任何改動。
1、配置文件 application.properties添加這一條:
feign.hystrix.enabled=true
2、創建回調類
創建HelloRemoteHystrix類繼承與HelloRemote實現回調的方法:
@Component public class HelloRemoteHystrix implements HelloRemote{ @Override public String hello(@RequestParam(value = "name") String name) { return "hello" +name+", this messge send failed "; } }
3、添加fallback屬性
在HelloRemote
類添加指定fallback類,在服務熔斷的時候返回fallback類中的內容:
@FeignClient(name= "spring-cloud-producer",fallback = HelloRemoteHystrix.class) public interface HelloRemote { @RequestMapping(value = "/hello") public String hello(@RequestParam(value = "name") String name); }
4、測試
那我們就來測試一下看看效果吧。
依次啟動spring-cloud-eureka、spring-cloud-producer、spring-cloud-consumer三個項目。
瀏覽器中輸入:http://localhost:9001/hello/neo
返回:hello neo,this is first messge
說明加入熔斷相關信息后,不影響正常的訪問。接下來我們手動停止spring-cloud-producer項目再次測試:
瀏覽器中輸入:http://localhost:9001/hello/neo
返回:hello neo, this messge send failed
根據返回結果說明熔斷成功。
隨著線上項目變的日益龐大,每個項目都散落著各種配置文件,如果采用分布式的開發模式,需要的配置文件隨著服務增加而不斷增多。某一個基礎服務信息變更,都會引起一系列的更新和重啟,不便于項目的維護,而Spring Cloud Config就是解決這個問題的。
目前Config支持git和svn作為存放配置文件的倉庫,本次示例使用git倉庫來存放配置文件。這里的Config-client 就相當于服務A和服務B,他們的配置文件都集中存放,通過Config-server來獲取各自的配置文件。
<div align=center> <img src="https://cache.yisu.com/upload/information/20210523/355/689889.png" width="50%" height="50%"> </div>
首先在github上面創建了一個文件夾config-repo用來存放配置文件,為了模擬生產環境,我們創建以下三個配置文件:
// 開發環境 neo-config-dev.properties // 測試環境 neo-config-test.properties // 生產環境 neo-config-pro.properties
每個配置文件中都寫一個屬性neo.hello,屬性值分別是 hello im dev/test/pro 。下面我們開始配置server端
###config-server端
1、添加依賴
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies>
只需要加入spring-cloud-config-server包引用既可。
2、配置文件
server: port: 8040 spring: application: name: spring-cloud-config-server cloud: config: server: git: uri: https://github.com/xxx # 配置git倉庫的地址 search-paths: config-repo # git倉庫地址下的相對地址,可以配置多個,用,分割。 username: # git倉庫的賬號 password: # git倉庫的密碼
Spring Cloud Config也提供本地存儲配置的方式。我們只需要設置屬性spring.profiles.active=native
,Config Server會默認從應用的src/main/resource
目錄下檢索配置文件。也可以通過spring.cloud.config.server.native.searchLocations=file:E:/properties/
屬性來指定配置文件的位置。雖然Spring Cloud Config提供了這樣的功能,但是為了支持更好的管理內容和版本控制的功能,還是推薦使用git的方式。
3、啟動類
啟動類添加@EnableConfigServer
,激活對配置中心的支持
@EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
到此server端相關配置已經完成
4、測試server端
首先我們先要測試server端是否可以讀取到github上面的配置信息,直接訪問:http://localhost:8001/neo-config/dev
返回信息如下:
{ "name": "neo-config", "profiles": [ "dev" ], "label": null, "version": null, "state": null, "propertySources": [ { "name": "https://github.com/goodrain-apps/spring-cloud-demo/config-repo/neo-config-dev.properties", "source": { "neo.hello": "hello im dev update" } } ] }
上述的返回的信息包含了配置文件的位置、版本、配置文件的名稱以及配置文件中的具體內容,說明server端已經成功獲取了git倉庫的配置信息。
如果直接查看配置文件中的配置信息可訪問:http://localhost:8001/neo-config-dev.properties
,返回:neo.hello: hello im dev
修改配置文件neo-config-dev.properties
中配置信息為:neo.hello=hello im dev update
,再次在瀏覽器訪問http://localhost:8001/neo-config-dev.properties
,返回:neo.hello: hello im dev update
。說明server端會自動讀取最新提交的內容
倉庫中的配置文件會被轉換成web接口,訪問可以參照以下的規則:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
以neo-config-dev.properties為例子,它的application是neo-config,profile是dev。client會根據填寫的參數來選擇讀取對應的配置。
###Config-client端
主要展示如何在業務項目中去獲取server端的配置信息
1、添加依賴
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</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-test</artifactId> <scope>test</scope> </dependency> </dependencies>
引入spring-boot-starter-web包方便web測試
2、配置文件
需要配置兩個配置文件,application.properties和bootstrap.properties
application.properties如下:
spring.application.name=spring-cloud-config-client server.port=8002
bootstrap.properties如下:
spring.cloud.config.name=neo-config spring.cloud.config.profile=dev spring.cloud.config.uri=http://localhost:8001/ spring.cloud.config.label=master
spring.application.name:對應{application}部分
spring.cloud.config.profile:對應{profile}部分
spring.cloud.config.label:對應git的分支。如果配置中心使用的是本地存儲,則該參數無用
spring.cloud.config.uri:配置中心的具體地址
spring.cloud.config.discovery.service-id:指定配置中心的service-id,便于擴展為高可用配置集群。
上面這些與spring-cloud相關的屬性必須配置在bootstrap.properties中,config部分內容才能被正確加載。因為config的相關配置會先于application.properties,而bootstrap.properties的加載也是先于application.properties。
3、啟動類
啟動類添加@EnableConfigServer
,激活對配置中心的支持
@SpringBootApplication public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); } }
啟動類只需要@SpringBootApplication
注解就可以
4、web測試
使用@Value
注解來獲取server端參數的值
@RestController class HelloController { @Value("${neo.hello}") private String hello; @RequestMapping("/hello") public String from() { return this.hello; } }
啟動項目后訪問:http://localhost:8002/hello
,返回:hello im dev update
說明已經正確的從server端獲取到了參數。到此一個完整的服務端提供配置服務,客戶端獲取配置參數的例子就完成了。
在微服務架構中,后端服務往往不直接開放給調用端,而是通過一個API網關根據請求的url,路由到相應的服務。當添加API網關后,在第三方調用端和服務提供方之間就創建了一面墻,這面墻直接與調用方通信進行權限控制,后將請求均衡分發給后臺服務端。而用來進行代理調度的組件就是Zuul。
在項目中,只有Zuul提供對外訪問,Gateway通過請求的url的不同,將請求調度到不同的后端服務
<div align=center> <img src="https://cache.yisu.com/upload/information/20210523/355/689890.png" width="75%" height="75%"> </div>
1、添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency>
引入spring-cloud-starter-zuul
包
2、配置文件
spring.application.name=gateway-service-zuul server.port=8888 #這里的配置表示,訪問/producer/** 直接重定向到http://域名/** zuul.routes.baidu.path=/producer/** zuul.routes.baidu.url=http://域名/
3、啟動類
@SpringBootApplication @EnableZuulProxy public class GatewayServiceZuulApplication { public static void main(String[] args) { SpringApplication.run(GatewayServiceZuulApplication.class, args); } }
啟動類添加@EnableZuulProxy
,支持網關路由。
4、測試
啟動gateway-service-zuul-simple
項目,先輸入:http://localhost:8888/producer/hello?name=neo
返回:hello neo,this is first messge
說明調度成功。
到此,關于“基于Spring Cloud的微服務架構怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。