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;
}
}