1. 程式人生 > >Spring Cloud實戰(一):微服務註冊與微服務發現

Spring Cloud實戰(一):微服務註冊與微服務發現

沒有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請求,超實用).示例如下:

@Service
public class WeakServiceImpl implements WeakService {

    private EurekaClient discoveryClient;

    private RestTemplate restTemplate;

    /**
     * @param discoveryClient
     */
    @Autowired
    public WeakServiceImpl(EurekaClient discoveryClient) {
        super();
        this.discoveryClient = discoveryClient;
        this.restTemplate = new RestTemplate(); 
    }

    public String serviceUrl() {
        InstanceInfo instance = discoveryClient.getNextServerFromEureka("ASSET", false);
        return instance.getHomePageUrl();
    }


    /* (non-Javadoc)
     * @see com.mirana.cloud.asset.service.WeakService#findAllAsset()
     */
    @Override
    public List<Asset> findAllAsset() {
        String url = this.serviceUrl() + Constants.ASSET_LIST;
        ResponseEntity<List<Asset>> results = this.restTemplate.exchange(url, 
                HttpMethod.GET, 
                null,
                new ParameterizedTypeReference<List<Asset>>() {});
        List<Asset> assets = results.getBody();
        return assets;
    }
}