本次分享的是關于springcloud服務注冊與發(fā)現(xiàn)的內容,將通過分別搭建服務中心,服務注冊,服務發(fā)現(xiàn)來說明;現(xiàn)在北京這邊很多創(chuàng)業(yè)公司都開始往springcloud靠了,可能是由于文檔和組件比較豐富的原因吧,畢竟是一款目前來說比較完善的微服務架構;本次分享希望能給大家?guī)砗玫膸椭?/p>
- eureka服務中心
- provider注冊服務
- consumer發(fā)現(xiàn)服務
- eureka服務中心高可用
eureka服務中心
就我現(xiàn)在了解到并且用的比較多的注冊中心有zookeeper和eureka,我的上上篇文章分享了dubbo+zookeeper來構建服務,因此本次用的是eureka,springcloud框架也是推薦它來作為注冊中心,當然可以集成其他的服注冊中心,畢竟springcloud依賴于springboot來構建項目的,因此集成其他組件是很快的;首先創(chuàng)建注冊中心項目 eureka_server ,通過如下引入依賴:
1
2
3
4
|
<dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-eureka-server</artifactid> </dependency> |
然后在application.yml文件中增加配置項:
1
2
3
4
5
6
7
8
9
10
11
12
|
server: port: 2001 spring: application: name: eureka-server eureka: client: register-with-eureka: false #禁止自己當做服務注冊 fetch-registry: false #屏蔽注冊信息 instance: prefer-ip-address: true instance-id: ${spring.application.name}:${server.port} |
配置完成后,還需要再啟動類增加注解 @enableeurekaserver ,設置基本完成即可運行,訪問 http: // localhost:2001/ 得到如下界面:
provider注冊服務
有了服務注冊中心,我們還需要提供一些服務并且把這些服務注冊到服務中心去,這里為了方便先創(chuàng)建一個服務提供者和消費者共同使用的接口模塊項目 eureka_api ,并創(chuàng)建如下接口和請求返回參數(shù)實體類:
1
2
3
4
5
6
7
8
|
public interface userinterface { @postmapping ( "/users" ) morp<list<mouser>> getusers(morq rq); @getmapping ( "/msg" ) string getmsg(); } |
mouser實體:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public class mouser { private long id; private string username; private string userpwd; public long getid() { return id; } public void setid( long id) { this .id = id; } public string getusername() { return username; } public void setusername(string username) { this .username = username; } public string getuserpwd() { return userpwd; } public void setuserpwd(string userpwd) { this .userpwd = userpwd; } } |
然后創(chuàng)建我們的服務提供端的模塊 eureka_provider ,同樣引入eureka依賴不過和server端有點區(qū)別:
1
2
3
4
|
<dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-eureka</artifactid> </dependency> |
再來創(chuàng)建服務提供端要提供的服務usercontroller,并且實現(xiàn)我們eureka_api模塊中的userinterface接口,代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@restcontroller public class usercontroller implements userinterface { @autowired private httpservletrequest request; @override public morp<list<mouser>> getusers(morq rq) { morp<list<mouser>> rp = new morp<>(); list<mouser> list = new arraylist<>(); for ( int i = 0 ; i < 5 ; i++) { mouser mouser = new mouser(); mouser.setid(i); mouser.setusername( "神牛" + i); list.add(mouser); } rp.sett(list); rp.setstatus(list.size() >= 1 ? 1 : 0 ); rp.setmessage(list.size() >= 1 ? "" : "暫無數(shù)據(jù)" ); return rp; } @override public string getmsg() { return "這里是provider,端口:" + request.getserverport(); } } |
這里需要注意的是controller的兩個服務接口中沒有再加postmapping或getmapping,因為這個由被實現(xiàn)接口申明了;定義好了users和msg服務后,我們還需要能把他們注入到服務注冊中心去,因此需要如下application.yml的配置:
1
2
3
4
5
6
7
8
9
10
11
12
|
spring: application: name: eureka-provider #服務名稱 eureka: client: service-url: defaultzone: http: //localhost:2001/eureka/ #服務中心地址 instance: prefer-ip-address: true instance-id: ${spring.application.name}:${server.port} server: port: 2004 |
我們還需要在啟動類增加如下標記 @enableeurekaclient ,它表示啟動eureka客戶端,因為服務提供者相對服務中心來說是屬于客戶端的存在;當運行eureka_provider項目的時候,我們在注冊中心能看到如下信息:
為了保證服務提供端接口沒問題,我們可以直接點擊eureka-provider:2004,然后增加要方法接口的路徑我這里是:http://192.168.153.148:2004/msg,即可得到如下正常訪問接口返回的信息:
consumer發(fā)現(xiàn)服務
有了接口服務,我們還需要消費服務,因此創(chuàng)建module項目eureka_consumer,因為這里采用fegin偽客戶端的方式來訪問我們服務提供端,并且同樣需要引入eureka的依賴:
1
2
3
4
5
6
7
8
|
<dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-eureka</artifactid> </dependency> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-feign</artifactid> </dependency> |
然后在service層定義userservice服務并且實現(xiàn)公共接口模塊 eureka_api 中的接口,代碼如:
1
2
3
|
@feignclient (value = "eureka-provider" ) public interface userservice extends userinterface { } |
通過feignclient來指定調用的服務端應用名稱eureka-provider,這名稱對應注冊在服務中心的application目錄下 ,在controller層創(chuàng)建一個響應的輸出usercontroller并分別提供兩個展示的接口,代碼如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@restcontroller public class usercontroller{ @autowired private userservice userservice; @getmapping ( "/users" ) public morp<list<mouser>> getusers(morq rq) { return userservice.getusers(rq); } @getmapping ( "/msg" ) public string getmsg() { return userservice.getmsg(); } } |
同樣consumer端也需要在application.yml中配置一些信息:
1
2
3
4
5
6
7
8
9
10
11
12
|
spring: application: name: eureka-consumer eureka: client: service-url: defaultzone: http: //localhost:2001/eureka/ #注冊中心地址 instance: prefer-ip-address: true instance-id: ${spring.application.name}:${server.port} server: port: 2005 |
配置基本和provider端差不多,最后需要在啟動類申明如下注解:
1
2
3
4
5
6
7
8
|
@springbootapplication @enablediscoveryclient //消費者客戶端 @enablefeignclients //feign客戶端 public class eurekaconsumerapplication { public static void main(string[] args) { springapplication.run(eurekaconsumerapplication. class , args); } } |
啟動eureka_consumer項目后,我們能在注冊中心看到它注冊進來的信息:
然后通過訪問eureka_consumer消費方的接口測試eureka_provider服務提供方的接口數(shù)據(jù)知否能正常響應,接口地址 http: // 192.168.153.148:2005/msg :
通過訪問consumer得到了provider的結果,這就是服務注冊和發(fā)現(xiàn)的基本測試流程;至于消費方怎么請求到提供方接口的,我們通過如下手工圖可解:
eureka服務中心高可用
由上面手工圖來看,服務中心承擔著很重要的角色,通常這種服務中心不僅僅只搭建一個,因此需要搭建一套高可用的服務中心出來;其實很簡單provider和consumer配置都不用動,我們只需要在第一節(jié)點的eureka-server項目的application.yml中配置下并且在多啟動幾個不同端口的服務就行了(同一臺服務器是多個端口,不同服務器端口可能是一樣的):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
server: port: 2001 spring: application: name: eureka-server eureka: client: register-with-eureka: true #配置高可用的時候需要開放自己注冊自己 fetch-registry: true service-url: defaultzone: http: //localhost:2002/eureka/ #注冊到端口2002的eureka中 # defaultzone: http: //localhost:2001/eureka/ instance: prefer-ip-address: true instance-id: ${spring.application.name}:${server.port} server: eviction-interval-timer-in-ms: 2000 #剔除失效服務間隔 |
高可用配置需要注意以下幾點:
- register-with-eureka: true 配置高可用的時候需要開放自己注冊自己,便于多個eureka注冊中心互通
- defaultzone:http://localhost:2002/eureka/ 每個注冊中心都需要吧自己注冊到別的注冊中心去
這里我創(chuàng)建了兩個注冊中心地址分別為:http://localhost:2001/,http://localhost:2002/;由于之前provider和consumer配置的注冊中心地址都是2001端口的,為了驗證高可用我們需要訪問2002端口注冊中心,效果如:
能夠看到2002端口有著2001端口同樣的注冊信息,當我關閉2001端口的應用時,2002還是能夠查到provider和consumer的信息,更詳細的配置可以參照官網說明。
git地址: https://github.com/shenniubuxing3
nuget 發(fā)布包:https://www.nuget.org/profiles/shenniubuxing3
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/wangrudong003/p/9117946.html