本次分享的是關於springcloud服務註冊與發現的內容,將通過分別搭建服務中心,服務註冊,服務發現來說明;現在北京這邊很多創業公司都開始往springcloud靠了,可能是由於文檔和組件比較豐富的原因吧,畢竟是一款目前來說比較完善的微服務架構;本次分享希望能給大家帶來好的幫助;
Eureka服務中心
就我現在了解到並且用的比較多的註冊中心有zookeeper和Eureka,我的上上篇文章分享了dubbo+zookeeper來構建服務,因此本次用的是Eureka,springcloud框架也是推薦它來作為註冊中心,當然可以集成其他的服註冊中心,畢竟springcloud依賴於springboot來構建項目的,因此集成其他組件是很快的;首先創建註冊中心項目eureka_server ,通過如下引入依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId></dependency>
然後在application.yml文件中增加配置項:
server: port: 2001spring: application: name: eureka-servereureka: 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註冊服務
有了服務註冊中心,我們還需要提供一些服務並且把這些服務註冊到服務中心去,這里為了方便先創建一個服務提供者和消費者共同使用的接口模塊項目eureka_api ,並創建如下接口和請求返回參數實體類:
public interface UserInterface { @PostMapping("/users") MoRp<List<MoUser>> getUsers(MoRq rq); @GetMapping("/msg") String getMsg();}MoUser實體:
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; }}然後創建我們的服務提供端的模塊eureka_provider ,同樣引入eureka依賴不過和server端有點區別:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency>
再來創建服務提供端要提供的服務UserController,並且實現我們eureka_api模塊中的UserInterface接口,代碼如下:
@RestControllerpublic 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 ? "" : "暫無數據"); return rp; } @Override public String getMsg() { return "這裡是provider,端口:"+ request.getServerPort(); }}這裡需要注意的是Controller的兩個服務接口中沒有再加PostMapping或GetMapping,因為這個由被實現接口申明了;定義好了users和msg服務後,我們還需要能把他們注入到服務註冊中心去,因此需要如下application.yml的配置:
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發現服務
有了接口服務,我們還需要消費服務,因此創建module項目eureka_consumer,因為這裡採用fegin偽客戶端的方式來訪問我們服務提供端,並且同樣需要引入eureka的依賴:
<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服務並且實現公共接口模塊eureka_api 中的接口,代碼如:
@FeignClient(value = "eureka-provider") public interface UserService extends UserInterface { }通過FeignClient來指定調用的服務端應用名稱eureka-provider,這名稱對應註冊在服務中心的Application目錄下,在Controller層創建一個響應的輸出UserController並分別提供兩個展示的接口,代碼如:
@RestControllerpublic 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中配置一些信息:
spring: application: name: eureka-consumereureka: client: service-url: defaultZone: http://localhost:2001/eureka/ #註冊中心地址instance: prefer-ip-address: true instance-id: ${spring.application.name}:${server.port}server: port: 2005配置基本和provider端差不多,最後需要在啟動類申明如下註解:
@SpringBootApplication@EnableDiscoveryClient //消費者客戶端@EnableFeignClients //feign客戶端public class EurekaConsumerApplication { public static void main(String[] args) { SpringApplication.run(EurekaConsumerApplication.class, args); }}啟動eureka_consumer項目後,我們能在註冊中心看到它註冊進來的信息:
然後通過訪問eureka_consumer消費方的接口測試eureka_provider服務提供方的接口數據知否能正常響應,接口地址http: // 192.168.153.148:2005/msg :
通過訪問consumer得到了provider的結果,這就是服務註冊和發現的基本測試流程;至於消費方怎麼請求到提供方接口的,我們通過如下手工圖可解:
Eureka服務中心高可用
由上面手工圖來看,服務中心承擔著很重要的角色,通常這種服務中心不僅僅只搭建一個,因此需要搭建一套高可用的服務中心出來;其實很簡單provider和consumer配置都不用動,我們只需要在第一節點的eureka-server項目的application.yml中配置下並且在多啟動幾個不同端口的服務就行了(同一台服務器是多個端口,不同服務器端口可能是一樣的):
server: port: 2001spring: application: name: eureka-servereureka: 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 #剔除失效服務間隔高可用配置需要注意以下幾點:
這裡我創建了兩個註冊中心地址分別為:http://localhost:2001/,http://localhost:2002/;由於之前provider和consumer配置的註冊中心地址都是2001端口的,為了驗證高可用我們需要訪問2002端口註冊中心,效果如:
能夠看到2002端口有著2001端口同樣的註冊信息,當我關閉2001端口的應用時,2002還是能夠查到provider和consumer的信息,更詳細的配置可以參照官網說明。
git地址: https://github.com/shenniubuxing3
nuget 發布包:https://www.nuget.org/profiles/shenniubuxing3
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。