沒有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();
}
}