Spring Cloud實戰(一):Eureka實現微服務註冊與微服務間調用(注意不是zuul進行URL路由)

沒有Spring Cloud,Spring Boot的實用性要大打折扣。

單個微服務雖然開發簡單、維護方便,但是沒有協作功能的微服務,其實在企業裏並沒有顯著的競爭力,跟NodeJS比起來,JAVA開發微服務並沒有多大的優勢。

但是有了Spring Cloud,將多個微服務協作起來工作,充分發揮JAVA在分佈式計算的優勢,那麼改變的不僅僅是開發的方式,而是整個服務框架與計算模式的設計方式。

在Spring Cloud裏,負責微服務註冊與發現的項目是Spring Cloud Netflix項目中的Eureka組件。Eureka分爲兩大部分,Eureka Server與Eureka Client。很顯然,Eureka Server負責管理、協調所有的微服務提供者,即Eureka Client,因此我們要使用創建協作的微服務框架,首先必須創建Eureka Server。

1. 創建Eureka Server

創建Euraka Server最簡單的方式莫過於使用SPRING INITIALIZR,配置好基本的項目源數據後,依賴僅僅需要選中“Eureka Server”即可。

在具體的實踐中,一定要記得在Spring Boot的啓動主類上添加“@EnableEurekaServer”註解,如下:

@SpringBootApplication
//  千萬不可忘記此註解,否則出現404錯誤
@EnableEurekaServer
public class MiranaEurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(MiranaEurekaApplication.class, args);
    }
}

將默認的配置文件application.properties改爲application.yml,添加如下內容:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    # 以下兩項一定要是false,表明自己是服務器,而不需要從其他主機發現服務
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    waitTimeInMsWhenSyncEmpty: 0

現在即可啓動MiranaEurekaApplication,訪問http://localhost:8761即可進入服務的狀態管理頁面。

2. 創建Eureka Client

依舊採用SPRING INITIALIZR,只不過此次依賴選擇“Eureka Discovery”,依舊導入maven項目,在主類上添加“@EnableEurekaClient”註解,如下:

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@RestController
public class MiranaAssetApplication {

    @RequestMapping("/")
    public String home() {
        return "Spring Cloud實戰";
    }


    public static void main(String[] args) {
        new SpringApplicationBuilder(MiranaAssetApplication.class).web(true).run(args);
    }
}

配置文件application.yml的內容很簡單,只需要指定一個不一樣的服務器端口即可,如下:

server:
  port: 8080

eureka:
  serviceUrl:
      defaultZone: http://localhost:8761/eureka/

spring:
  application:
    name: ASSET

此外,爲了便於服務的發現,強烈建議添加“spring.application.name”屬性,這也是註冊的服務ID,也是以後其他微服務端能調用本服務的識別ID。

現在啓動MiranaAssetApplication,就會發現此服務已被註冊與發現,見下圖。 
微服務註冊

3. 啓動多個微服務實例

爲了提高服務的健壯性,對於每個微服務,我們可以啓動多個實例,對服務的使用者而言,它們是一個統一的整體,唯一能識別它們的就是服務ID,即spring.application.name配置項(不區分大小寫),如我們將WEAK服務啓動兩個實例,如下圖: 
多個微服務實例

4. 進一步測試

我們使用微服務的目的在於協作多個服務接口共同工作,所以我們還應該創建其他的微服務程序,如果簡單點,可將上述的微服務程序的服務端口改爲8081,而且服務ID改爲不一樣,即可進行簡單測試

5. 發現服務與消費服務

在spring-cloud中,客戶發現與消費服務主要依靠com.netflix.discovery.EurekaClient與org.springframework.web.client.RestTemplate . EurekaClient主要用來獲取所要調用的方法所在的實例的url地址, RestTemplate進行服務調用(其實就是Spring框架封裝的http請求,超實用).示例如下:

@RequestMapping("/test")
@RestController
public class TestEureka {
    
    private RestTemplate restTemplate=new RestTemplate();//不能用注入的方式因爲這個沒有定義爲spring管理的bean

    @Autowired
    private EurekaClient eurekaClient;
    @RequestMapping(value="/get",method=RequestMethod.GET)
    private String findGet(){
        InstanceInfo nextServerFromEureka = eurekaClient.getNextServerFromEureka("ASSET", false);//ASSET爲定義的應用名
        String url=nextServerFromEureka.getHomePageUrl()+Constants.ASSET_GET; // 後面常量爲自定義的方法路徑
        String result = restTemplate.exchange(url, HttpMethod.GET, null, String.class).getBody();
        System.out.println(result);
        return result; 
    }
    public static void main(String[] args) {
        TestEureka test = new TestEureka();
        test.findGet();
    }
    
}
 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章