天天看點

實戰Spring Cloud微服務治理元件Eureka

文章目錄

  • ​​背景​​
  • ​​一、Eureka Server搭建​​
  • ​​1.1 建立Spring Cloud工程​​
  • ​​1.2 修改啟動類​​
  • ​​1.2 增加Eureka配置​​
  • ​​1.3 啟動Eureka伺服器​​
  • ​​二、搭建Eureka服務提供者​​
  • ​​2.1 建立商品服務項目​​
  • ​​2.2 修改啟動類​​
  • ​​2.2 增加Eureka Client配置​​
  • ​​2.3 編寫商品服務程式​​
  • ​​2.4 啟動商品服務​​
  • ​​三、搭建Eureka服務消費者​​
  • ​​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,可以讓開發者通過注解的方式實作遠端微服務調用,大大簡化了代碼的編寫。