文章目錄
- 背景
- 一、Eureka Server搭建
- 1.1 建立Spring Cloud工程
- 1.2 修改啟動類
- 1.2 增加Eureka配置
- 1.3 啟動Eureka伺服器
- 2.1 建立商品服務項目
- 2.2 修改啟動類
- 2.2 增加Eureka Client配置
- 2.3 編寫商品服務程式
- 2.4 啟動商品服務
- 3.1 建立使用者服務項目
- 3.2 修改啟動類
- 3.3 配置Eureka消費者
- 3.4 建立Restful測試接口,在接口中調用商品微服務
- 3.5 調用Restful接口進行測試
背景
- 分布式微服務架構的核心是對應用按單一職責進行拆分,形成獨立部署的服務單元。随着服務的不斷水準擴充,需要有專門的服務治理元件來管理和保證微服務的可用性。
- Eureka是Netflix開源微服務架構中專門進行服務發現及治理的元件,Spring Cloud對其進行了二次封裝,并與Spring Boot緊密內建。
- 本文将通過實戰掌握Eureka基本的使用。
實戰Spring Cloud微服務治理元件Eureka
一、Eureka Server搭建
1.1 建立Spring Cloud工程
- 通過Spring網站建立項目
實戰Spring Cloud微服務治理元件Eureka - 設定項目屬性
實戰Spring Cloud微服務治理元件Eureka - 選擇Spring Cloud Discovery
實戰Spring Cloud微服務治理元件Eureka - 自動生成項目結構及下載下傳jar包
實戰Spring Cloud微服務治理元件Eureka
1.2 修改啟動類
- 隻需要增加@EnableEurekaServer注解,Spring Boot在啟動應用的時候就會自動建構一個預設的服務治理伺服器。
/**
* Eureka服務啟動類
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
1.2 增加Eureka配置
- 在項目配置檔案application.properties中增加Eureka相關配置
# 伺服器端口
server.port=8761
# 服務名稱
spring.application.name=eureka-server
# 是否将自己注冊到Eureka服務中
# 服務本身就是服務治理伺服器,而且尚未建構任何服務治理叢集,是以将其設定為false
eureka.client.register-with-eureka=false
# 是否從Eureka中擷取注冊資訊
eureka.client.fetch-registry=false
1.3 啟動Eureka伺服器
- 啟動Eureka伺服器項目,并通過http://localhost:8761通路Eureka控制台
實戰Spring Cloud微服務治理元件Eureka
實戰Spring Cloud微服務治理元件Eureka
二、搭建Eureka服務提供者
2.1 建立商品服務項目
- 建立SpringBoot工程
實戰Spring Cloud微服務治理元件Eureka - 設定項目名稱為goods-service
實戰Spring Cloud微服務治理元件Eureka - 勾選Spring Cloud Discovery- Eureka Discovery Client
實戰Spring Cloud微服務治理元件Eureka - 增加 spring-boot-starter-web依賴
實戰Spring Cloud微服務治理元件Eureka
2.2 修改啟動類
- 在應用引導類中增加@EnableDiscoveryClient注解:通過該注解,在Spring Boot啟動完畢之後,就會根據配置中的資訊嘗試與服務治理伺服器進行連接配接,連接配接成功之後進行服務注冊或者服務注冊資訊的同步。
/**
* 商品服務啟動類
*/
@EnableEurekaClient
@SpringBootApplication
public class GoodsServiceApplication {
public static void main(String[] args) {
SpringApplication.run(GoodsServiceApplication.class, args);
}
}
2.2 增加Eureka Client配置
# 伺服器端口
server.port=8080
# 服務名稱
spring.application.name=goods-service
# 是否将自己注冊到Eureka服務中: 服務需要向服務治理伺服器進行注冊
eureka.client.register-with-eureka=true
# 是否從Eureka中擷取注冊資訊:啟動時從服務治理伺服器拉取資訊
eureka.client.fetch-registry=true
#Eureka用戶端與Eureka服務端進行互動的位址
eureka.client.service-url.defaultZone=http://172.22.34.63:8761/eureka
2.3 編寫商品服務程式
/**
* 商品服務-模拟傳回商品清單
*/
@RestController
@RequestMapping("api/goods")
public class GoodsService {
// 傳回商品清單
@GetMapping
public List<Goods> getAllGoods() {
List<Goods> goods = new ArrayList<>();
goods.add(new Goods("電腦", 10));
goods.add(new Goods("手機", 20));
goods.add(new Goods("書籍", 30));
return goods;
}
}
/**
* 商品類
*/
public class Goods implements Serializable {
// 商品名稱
private String name;
// 商品價格
private Integer number;
public Goods(String name, Integer number) {
this.name = name;
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
}
2.4 啟動商品服務
- 啟動該工程項目,并通過Eureka控制台觀察商品服務是否已在服務治理伺服器進行注冊
實戰Spring Cloud微服務治理元件Eureka - 注冊成功
實戰Spring Cloud微服務治理元件Eureka
三、搭建Eureka服務消費者
3.1 建立使用者服務項目
- 項目命名為user-consumer
實戰Spring Cloud微服務治理元件Eureka - 勾選Spring Cloud Discovery- Eureka Discovery Client
實戰Spring Cloud微服務治理元件Eureka - 增加 spring-boot-starter-web依賴
3.2 修改啟動類
- 在應用引導類中增加@EnableDiscoveryClient注解:通過該注解,在Spring Boot啟動完畢之後,就會根據配置中的資訊嘗試與服務治理伺服器進行連接配接,連接配接成功之後可以向服務治理伺服器擷取服務清單。
- 建立一個RestTemplate Bean,加上@LoadBalanced注解,讓消費者通過Eureka伺服器中注冊的服務名通路服務提供者。
/**
* 使用者消費者啟動類
*/
@EnableEurekaClient
@SpringBootApplication
public class UserConsumerApplication {
// 向Spring注冊一個RestTemplate Bean
@Bean
// 必須加入 @LoadBalanced注解,否則不能以Eureka中注冊的服務名進行通路
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
}
3.3 配置Eureka消費者
server.port=8081
spring.application.name=user-consumer
# 向eureka伺服器擷取服務清單
eureka.client.fetch-registry=true
#Eureka用戶端與Eureka服務端進行互動的位址
eureka.client.service-url.defaultZone=http://172.22.34.63:8761/eureka
# 調用商品服務的位址
goods-service.url=http://GOODS-SERVICE/
3.4 建立Restful測試接口,在接口中調用商品微服務
/**
* 使用者消費者--調用eureka伺服器中的商品服務,并對外提供RestFul接口測試
*/
@RestController
@RequestMapping("user/")
public class UserConsumer {
@Autowired
private RestTemplate restTemplate;
@Value("${goods-service.url}")
private String url;
@GetMapping("/goods")
public User getUserGoods() {
User user = new User();
// 調用商品微服務
Object response = restTemplate.getForEntity(url + "api/goods", Object.class).getBody();
try {
user.setName("jack");
user.setGoods((List<GoodsDTO>) response);
} catch (Exception e){
throw new RuntimeException(e.getMessage());
}
return user;
}
}
/**
* 使用者類
*/
public class User implements Serializable {
private String name;
private List<GoodsDTO> goods;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<GoodsDTO> getGoods() {
return goods;
}
public void setGoods(List<GoodsDTO> goods) {
this.goods = goods;
}
}
/**
* 商品資料傳輸類
*/
public class GoodsDTO {
private String name;
private Integer number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
}
3.5 調用Restful接口進行測試
小結
- 按搭建服務治理伺服器、微服務提供者、微服務消費者三個步驟進行了實戰示範。
- Eureka Server 環境一般都需要部署至少兩個server,通過配置實作互相向對方注冊,保證服務治理中心的高可用性。
- 服務治理還會結合用戶端負載均衡元件Ribbon,保證微服務調用的高性能。
- 在以上文章中僅是通過RestTemplate實作了服務消費者向提供者,但實際生産項目中會引入Feign,可以讓開發者通過注解的方式實作遠端微服務調用,大大簡化了代碼的編寫。