Spring Cloud 系列之 Eureka 實現服務註冊與發現

来源:https://www.cnblogs.com/fengzheng/archive/2019/03/27/10603672.html
-Advertisement-
Play Games

如果你對 Spring Cloud 體系還不是很瞭解,可以先讀一下 "Spring Cloud 都有哪些模塊" Eureka 是 Netflix 開源的服務註冊發現組件,服務發現可以說是微服務架構的核心功能了,微服務部署之後,一定要有服務註冊和發現的能力,Eureka 就是擔任這個角色的。如果你用過 ...


如果你對 Spring Cloud 體系還不是很瞭解,可以先讀一下 Spring Cloud 都有哪些模塊

Eureka 是 Netflix 開源的服務註冊發現組件,服務發現可以說是微服務架構的核心功能了,微服務部署之後,一定要有服務註冊和發現的能力,Eureka 就是擔任這個角色的。如果你用過 dubbo 的話,那一定知道 dubbo 中服務註冊和發現的功能是用 zookeeper 來實現的。

Eureka 目前是 2.x 版本,並且官方已經宣佈不再維護更新。不過其實 Eureka 已經很穩定了,當做註冊中心完全沒有問題。Spring Cloud 集成了 Eureka ,並做了完善的封裝。方便我們使用 Spring boot 開發的時候簡單配置就可以使用。

微服務框架中有三類角色,分別是註冊中心、服務提供者、服務消費者,註冊中心就是今天要說的主角 Eureka,這篇文章簡單說明 Spring Cloud Eureka 的使用,模擬實現單點和高可用註冊中心,並簡單介紹服務提供者和服務消費者如何使用 Eureka 提供的服務註冊和發現功能。

版本說明
Java : 1.8

Spring Boot : 2.1.3.RELEASE

Spring Cloud: Finchley.SR2

之說以要說一下版本,因為 Finchley.SR2 版本較之前的版本包名有變化,所以在引用 maven 包的時候要註意。

單點註冊中心

創建 Eureka 註冊中心

1、引用 maven 包,其中

<dependencyManagement> 
  <dependencies> 
    <dependency> 
      <groupId>org.springframework.cloud</groupId>  
      <artifactId>spring-cloud-dependencies</artifactId>  
      <version>Finchley.SR2</version>  
      <type>pom</type>  
      <scope>import</scope> 
    </dependency> 
  </dependencies> 
</dependencyManagement>

<!-- 最新版的 eureka 服務端包 -->
<dependency> 
  <groupId>org.springframework.cloud</groupId>  
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> 
</dependency>

<!-- 監控管理 -->
<dependency> 
  <groupId>org.springframework.boot</groupId>  
  <artifactId>spring-boot-starter-actuator</artifactId> 
</dependency>

2、新建 bootstrap.yml,並配置 Spring cloud 參數

spring:
  application:
    name: kite-eureka-center
  cloud:
    inetutils: ## 網卡設置
      ignoredInterfaces:  ## 忽略的網卡
        - docker0
        - veth.*
        - VM.*
      preferredNetworks:  ## 優先的網段
        - 192.168

3、新建 application.yml ,並配置參數

server:
  port: 3000
eureka:
  instance:
    hostname: eureka-center
    appname: 註冊中心
  client:
    registerWithEureka: false # 單點的時候設置為 false 禁止註冊自身
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://localhost:3000/eureka
  server:
    enableSelfPreservation: false
    evictionIntervalTimerInMs: 4000

bootstrap.yml 和 application.yml 的區別:

  • bootstrap.yml 在 application.yml 之前啟動;

  • bootstrap.yml 配置 application 的 name、spring.cloud.config.server.git.uri、一些encryption/decryption(加密/解密)信息;

  • application.yml 的信息會覆蓋 bootstrap.yml 中的內容,當遇到相同的配置的時候;

4、新建 Application.java 啟動文件

@EnableEurekaServer
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@EnableEurekaServer 表示使用 Eureka Server 端功能,也就是啟動為一個註冊中心節點。

5、運行 Application.java ,訪問 http://localhost:3000 即可看到 Eureka 提供的 ui 控制台。

創建一個服務提供者

接下來創建一個服務提供者,並註冊到上面創建的 Eureka 註冊中心。

1、添加 maven 依賴包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka 客戶端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、配置 application.yml

server:
  port: 3001

eureka:
  instance:
    preferIpAddress: true
  client:
    serviceUrl:
      defaultZone: http://localhost:3000/eureka  ## 註冊到 eureka 
spring:
  application:
    name: single-provider  ## 應用程式名稱,後面會在消費者中用到

3、創建一個簡單的 RESTful 介面 controller

@Slf4j
@RestController
public class ProviderController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping(value = "/hello")
    public String hello(){
        List<String> services = discoveryClient.getServices();
        for(String s : services){
            log.info(s);
        }
        return "hello spring cloud!";
    }

    @RequestMapping(value = "/nice")
    public String nice(){
        List<String> services = discoveryClient.getServices();
        for(String s : services){
            log.info("gogogo" + s);
        }
        return "nice to meet you!";
    }

}

4、創建 spring boot 啟動類

@EnableEurekaClient
@SpringBootApplication
public class SingleProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(SingleProviderApplication.class, args);
    }
}

@EnableEurekaClient 修飾,表示要註冊到註冊中心。

5、啟動項目,正常情況下就註冊到了 Eureka 註冊中心,打開 Eureka 控制台,會看到已經出現了這個服務

創建一個服務消費者

有了服務提供者,接下來創建一個消費者來消費一下

1、引用 maven 包

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、配置 application.yml

server:
  port: 3002
eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:3000/eureka  ## 註冊到 eureka
  instance:
    preferIpAddress: true
spring:
  application:
    name: single-customer  

3、開始消費提供者提供的服務介面,這裡演示了兩種消費方法,一種是用 RestTemplate ,另外一種是用 FeignClient,Feign 同樣是 Netflix 開源,並被 Spring Cloud 封裝到 spring-cloud-starter-openfeign 包中。

創建啟動類,並添加相關註解

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SingleCustomerApplication {

    /**
     * 註入 RestTemplate 
     * 並用 @LoadBalanced 註解,用負載均衡策略請求服務提供者
     * 這是 Spring Ribbon 的提供的能力
     * @return
     */
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(SingleCustomerApplication.class, args);
    }
}

@EnableEurekaClient 聲明此項目為一個 eureka 客戶端,@EnableFeignClients 聲明此項目可以使用 Feign。

4、創建一個服務介面類,這是 Feign 的使用方式,詳細的用法可以查一下 Spring Cloud Feign 相關文檔

/**
 * IHelloService
 * 配置服務提供者:single-provider 是服務提供者的 application.name
 */
@FeignClient("single-provider")
public interface IHelloService {

    @RequestMapping(value = "/hello")
    String hello();

    @RequestMapping(value = "nice")
    String nice();
}

@FeignClient 註解的 value 為服務提供者的 appplication.name 。

5、創建一個 Controller 用於調用服務

@RestController
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private IHelloService helloService;

    private static final String applicationName = "single-provider";

    @RequestMapping(value = "feignRequest")
    public Object feignRequest(){
        String s = helloService.nice();
        return s;
    }

    @RequestMapping(value = "commonRequest")
    public Object commonRequest(){
        String url = "http://"+ applicationName +"/hello";
        String s = restTemplate.getForObject(url,String.class);
        return s;
    }

}

其中 feignRequest 方法是使用了 Feign 的方式調用服務介面;

commonRequest 方法是用 RestTemplate 提供的方法調用服務介面;

6、最後,啟動服務,訪問地址:http://localhost:3002/commonRequest 和 http://localhost:3002/feignRequest

獲取源碼

如果你覺得寫的還可以的話,請點個「推薦」吧

歡迎關註,不定期更新本系列和其他文章
古時的風箏 ,進入公眾號可以加入交流群
掃碼關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [TOC] 總 本博文是2019年北航面向對象(OO)課程第一單元作業(多項式求導)的總結。三次作業的要求大致如下: 第一次作業:簡單冪函數的求導,如 $1 + x^5 + 4 x^3$ 第二次作業:簡單冪函數和簡單正餘弦函數的求導,如 $ 5 sin(x)^2+5 cos(x) cos(x)+12 ...
  • 構造方法 概念: 又叫 構造器,區分於傳統的方法,是一個在創建對象時被系統自動調用的特殊方法 作用: 一:為對象進行初始化(成員變數)的工作 二:為對象在堆記憶體中開闢獨立的記憶體空間 定義格式: 訪問修飾符 方法名(){ } 用法: 只能通過new關鍵字進行調用 註意事項: 一:方法名必須和類名保持一 ...
  • 一、前三次作業內容分析總結 前言 前三次作業,我提交了三次,但是有效作業只有兩次,最後一次作業沒能實現多項式求導的基本功能因此無疾而終,反思留給後文再續,首先我介紹一下這三次作業,三次作業圍繞著多項式求導展開,輸出目的都是一致的,即對輸入的多項式進行求導,將求導結果列印到顯示屏,作業難度遞增,每一次 ...
  • 記得比較早使用手機掃碼登錄是網頁版微信,這種免去輸入繁瑣的賬號密碼,拿起手機掃一掃就可以登錄的方式一開始還是比較驚艷的,確實使用起來很方便。 那它是如何實現的呢?我們來簡單研究下。(以淘寶網二維碼登錄為例) 首先,任何一個二維碼表示的都是一串字元串。 我們打開淘寶登錄頁面: "https://log ...
  • 第一次作業 第一次作業需要完成的任務為簡單多項式導函數的求解。 思路 因為僅僅是簡單多項式的求導,所以求導本身沒有什麼可說的,直接套用冪函數的求導公式就行了,主要的精力是花在了正則表達式上。這裡推薦兩個網站: https://github.com/ziishaned/learn regex http ...
  • 第一單元總結 作業總結 一 程式結構分析 ​ 因為在此之前並沒有接觸過 java 語言或者是與之相似的語言, 而不用說 OO 的概念, 所以一切都是全新的. 開始的時候腦子並沒有任何面向對象的概念, 類這個概念僅僅建立在 C 語言的某個 .c 文件之上, 簡單地認為 java 中的類就是 C 中的 ...
  • 目錄 homework & class & trainning : 兩次上機、三次作業、四周課堂 code analysis & review : 為什麼我沒有bug 黑盒測試和白盒測試 OO 設計感言 Scanning: Creational Pattern & Multithreading 一、 ...
  • 背景 應該是在去年的時候,刷知乎看到一個問題,大概是說怎麼刷網易雲音樂個人累計聽歌數,然後有一個高贊回答,貼了一段js代碼,直接在瀏覽器console執行就可以了。當時試了下,直接一下子刷了有好幾萬。悲劇的是,第二天又回到原來的樣子了,很明顯這種方式被網易雲音樂發現封掉了。而且後續網易雲還針對累計聽 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...