欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Cloud 系列之注冊中心 Eureka詳解

 更新時間:2020年11月03日 10:56:06   作者:Demo_Null  
Netflix Eureka 是由 Netflix 開源的一款基于 REST 的服務發(fā)現(xiàn)組件,包括 Eureka Server 及 Eureka Client。這篇文章主要介紹了Spring Cloud 系列之注冊中心 Eureka,需要的朋友可以參考下

1.1 簡介

 1.1.1 概述

  Netflix Eureka 是由 Netflix 開源的一款基于 REST 的服務發(fā)現(xiàn)組件,包括 Eureka Server 及 Eureka Client。2012 年 9 月在 GitHub 上發(fā)布 1.1.2 版本,目前 Netflix 以宣布閉源,所以市面上還是以 1.x 版本為主。Eureka 提供基于 REST 的服務,在集群中主要用于服務管理。Eureka 提供了基于 Java 語言的客戶端組件,客戶端組件實現(xiàn)了負載均衡的功能,為業(yè)務組件的集群部署創(chuàng)造了條件。使用該框架,可以將業(yè)務組件注冊到 Eureka 容器中,這些組件可進行集群部署,Eureka 主要維護這些服務的列表并自動檢查它們的狀態(tài)。Spring Cloud Netflix Eureka 是 Pivotal 公司為了將 Netflix Eureka 整合于 Spring Cloud 生態(tài)系統(tǒng)提供的版本。
  Eureka 包含兩個組件:Eureka Server 和 Eureka Client, Eureka Server 提供服務注冊服務。各個微服務節(jié)點通過配置啟動后,會在 EurekaServer 中進行注冊,這樣 EurekaServer 中的服務注冊表中將會存儲所有可用服務節(jié)點的信息,服務節(jié)點的信息可以在界面中直觀看到。EurekaClient 通過注冊中心進行訪問。它是一個 Java 客戶端,用于簡化 Eureka Server 的交互,客戶端同時也具備一個內置的、使用輪詢(round-robin)負載算法的負載均衡器。在應用啟動后,將會向 Eureka Server 發(fā)送心跳(默認周期為30秒)。如果 Eureka Server 在多個心跳周期內沒有接收到某個節(jié)點的心跳,EurekaServer 將會從服務注冊表中把這個服務節(jié)點移除(默認90秒)

在這里插入圖片描述

1.1.2 原理圖

  一個簡單的 Eureka 集群,需要一個 Eureka 服務器、若干個服務提供者。我們可以將業(yè)務組件注冊到 Eureka 服務器中,其他客戶端組件可以向服務器獲取服務并且進行遠程調用。Eureka:就是服務注冊中心(可以是一個集群),對外暴露自己的地址;提供者:啟動后向 Eureka 注冊自己信息(地址,提供什么服務);消費者:向 Eureka 訂閱服務,Eureka 會將對應服務的所有提供者地址列表發(fā)送給消費者,并且定期更新;心跳(續(xù)約):提供者定期通過 http 方式向 Eureka 刷新自己的狀態(tài)。

在這里插入圖片描述

1.1.3 相關依賴

<!-- 需要確定 Spring Cloud 版本 -->
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

1.2 搭建 EurekaServer

 1.2.1 相關依賴

  現(xiàn)在都是子父工程,我們將子模塊中都需要用的依賴放到父工程的 pom 文件中

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <packaging>pom</packaging>
 <modules>
 <module>eureka</module>
 </modules>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.2.10.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.software</groupId>
 <artifactId>spring-cloud</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>spring-cloud</name>
 <description>Demo project for Spring Boot</description>

 <properties>
 <java.version>1.8</java.version>
 <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
 </properties>

 <dependencies>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>
 <!-- 演示就不使用數(shù)據(jù)庫了 -->
		<!--<dependency>-->
		<!--<groupId>org.springframework.boot</groupId>-->
		<!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
		<!--</dependency>-->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <!-- H 版 Spring Cloud 將 server 與 client 分開了,需要導入兩個坐標 -->
 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
 </dependency>
 </dependencies>

 <dependencyManagement>
 <dependencies>
  <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-dependencies</artifactId>
  <version>${spring-cloud.version}</version>
  <type>pom</type>
  <scope>import</scope>
  </dependency>
 </dependencies>
 </dependencyManagement>

 <build>
 <plugins>
  <plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  </plugin>
 </plugins>
 </build>

</project>

1.2.2 聲明為 Eureka Server

  在 eureka 服務的啟動類上使用 @EnableEurekaServer,聲明當前應用為 Eureka 服務。

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/29
 * @description Eureka 啟動類
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
 public static void main(String[] args) {
 SpringApplication.run(EurekaApplication.class, args);
 }
}

1.2.3 配置文件

server:
 port: 8081

spring:
 application:
 name: eurekaServer # 應用名稱,在 Eureka 中作為 id 標識

eureka:
 client:
 register-with-eureka: false # 不注冊自己
 fetch-registry: false # 不拉取自己
 service-url:
 defaultZone: http://127.0.0.1:8081/eureka/ # EurekaServer 的地址,如果是集群,需要加上其它 Server 的地址

1.2.4 啟動服務

  啟動服務訪問對應的端口就可以看到以下界面,現(xiàn)在是一個服務都沒有注冊上來??梢园?register-with-eurekafetch-registry 兩個配置取消就可以看到 eureka 自己了。

在這里插入圖片描述

在這里插入圖片描述




1.3 提供者

1.3.1 聲明為 Eureka Client

  在服務提供者啟動類中使用 @EnableDiscoveryClient,讓 Eureka 能夠發(fā)現(xiàn),掃描到該服務。@EnableEurekaClient 注解也能實現(xiàn)但是該注解只支持 Eureka 作為注冊中心,@EnableDiscoveryClient 可以是其他注冊中心,建議使用 @EnableDiscoveryClient

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/29
 * @description 服務提供者啟動類
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
 public static void main(String[] args) {
 SpringApplication.run(ProviderApplication.class, args);
 }
}

1.3.2 配置文件

server:
 port: 8082

spring:
 application:
 name: ProviderServer # 應用名稱,在 Eureka 中作為 id 標識

eureka:
 client:
 service-url:
 defaultZone: http://127.0.0.1:8081/eurake/

1.3.3 提供服務

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/29
 * @description
 */

@RestController
@RequestMapping("/provider")
public class ProviderController {

 @GetMapping("/get")
 public Object get() {
 return "你已經(jīng)消費了";
 }
}

1.3.4 啟動服務

  啟動服務之后,會自動將自己注冊到 Eureka 中

在這里插入圖片描述

1.4 消費者

1.4.1 聲明為 Eureka Client

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/29
 * @description 消費者啟動類
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
 public static void main(String[] args) {
 SpringApplication.run(ConsumerApplication.class, args);
 }
	
	// 將 RestTemplate 交由容器管理
 @Bean
 public RestTemplate getRestTemplate() {
 return new RestTemplate();
 }
}

1.4.2 配置文件

server:
 port: 8083

spring:
 application:
 name: ConsumerServer # 應用名稱,在 Eureka 中作為 id 標識

eureka:
 client:
 service-url:
 defaultZone: http://127.0.0.1:8081/eureka

1.4.3 消費服務

  我們之前使用 RestTemplate 需要自己寫 URI,這樣很不利于維護,而且容易出錯,現(xiàn)在只需要確定應用名稱,利用應用名稱從 Eureka 中就可以獲取到詳細信息。

/**
 * Created with IntelliJ IDEA.
 *
 * @author gaohu9712@163.com
 * @date 2020/10/29
 * @description
 */
@RestController
@RequestMapping("/consumer")
public class ConsumerController {

 @Autowired
 private DiscoveryClient discoveryClient;


 @GetMapping("/go")
 public void go() {
 List<ServiceInstance> providerServer = discoveryClient.getInstances("ProviderServer");

 if (0 == providerServer.size()) {
  return;
 }

 ServiceInstance serviceInstance = providerServer.get(0);
 String host = serviceInstance.getHost();
 int port = serviceInstance.getPort();
 URI uri = serviceInstance.getUri();
 System.out.println("主機:" + host);
 System.out.println("端口:" + port);
 System.out.println("uri:" + uri);

 RestTemplate restTemplate = new RestTemplate();
 String str = restTemplate.getForObject(uri + "/provider/get", String.class);
 System.out.println(str);
 }
}

1.4.4 啟動服務

在這里插入圖片描述

1.4.5 請求服務

在這里插入圖片描述

1.4.6 執(zhí)行流程

 ♞ 先啟動 eureka 注冊中心
 ♞ 啟動服務提供者 provider
 ♞ 服務提供者啟動后會把自身信息(比如服務地址以別名方式注冊進 eureka)
 ♞ 消費者 consumer 服務在需要調用接口時,使用服務別名去注冊中心獲取實際的 RPC 遠程調用地址
 ♞ 消費者獲得調用地址后,底層實際是利用 HttpClient 技術實現(xiàn)遠程調用
 ♞ 消費者獲得服務地址后會緩存在本地 jvm 內存中,默認每間隔 30 秒更新一次服務調用地址

1.5 補充配置

1.5.1 actuator 信息完善

  我們現(xiàn)在的服務注冊到 Eureka 上面是沒有 ip 地址的,以后等服務搭建集群是很不方便的,所以我們需要讓他顯示自己的 ip 地址;第二個就是服務名稱為主機 + 服務名 + 端口,這樣就暴露了主機名,我們可以指定顯示的名稱。

在這里插入圖片描述

在配置文件中添加如下配置,通過健康檢查(http://ip:port/actuator/health)查看是否修改成功。

eureka:
 instance:
 # 實例名稱
 instance-id: consumer-01
 # 地址中顯示 ip 
 prefer-ip-address: true

在這里插入圖片描述

1.5.2 自我保護機制 ☞ 概述

  我們可以看到 Eureka 上有一行紅色的英文 EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.它代表了 Eureka 保護模式的開啟。一旦進入保護模式,Eureka Server 將會嘗試保護其服務注冊表中的信息,不再刪除服務注冊表中的數(shù)據(jù),也就是不會注銷任何微服務。
  默認情況下,如果 Eureka Server 在一定時間內沒有接收到某個微服務實例的心跳,Eureka Server 將會注銷該實例(默認90秒)。但是當網(wǎng)絡分區(qū)故障發(fā)生(延時、卡頓、擁擠)時,微服務與 Eureka Server 之間無法正常通信,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該注銷這個微服務。為了防止 Eureka Client 可以正常運行,但是與 Eureka Server 網(wǎng)絡不通情況下,Eureka Server 不會立刻將 Eureka Client 服務剔除。

☞ 關閉自我保護機制

  我們之前的 Eureka 截圖中可以看到 DESKTOP-GL7GS52:ConsumerServer:8083,consumer-01 兩個同時存在,這明明是一個服務,修改完配置之后前面的沒有剔除,這就是因為自我保護機制打開了。

# Eureka Server 配置
eureka:
 server:
 # 關閉自我保護模式, 默認為打開
 enable-self-preservation: false 
 # 續(xù)期時間,即掃描失效服務的間隔時間 
 eviction-interval-timer-in-ms: 5000 


# Eureka Client 配置
eureka:
 instance:
 # Eureka Client 給 Eureka Server 發(fā)送心跳的時間間隔,默認 30 單位是 s
 lease-renewal-interval-in-seconds: 1
 # Eureka Server 最后一次收到心跳的等待上限,超時剔除服務,默認 90 單位是 s
 lease-expiration-duration-in-seconds: 2

1.6 Eureka 高可用

1.6.1 Eureka 集群搭建

  在之前的單體中我們的端口是隨意的,但是搭建集群我們需要對端口進行規(guī)劃,例如將 808X 端口作為 Eureka 集群的端口。先來看下配置有什么區(qū)別,起初我們是將自己注冊到自己上,現(xiàn)在我們需要將自己注冊到其他 Eureka 上,有多個則用 , 隔開。

server:
 port: 8081

spring:
 application:
 name: eurekaServer

eureka:
 client:
 register-with-eureka: false
 fetch-registry: false
 service-url:
 defaultZone: http://127.0.0.1:8082/eureka
 server:
 enable-self-preservation: false
 eviction-interval-timer-in-ms: 5000
server:
 port: 8082

spring:
 application:
 name: eurekaServer_back

eureka:
 client:
 register-with-eureka: false
 fetch-registry: false
 service-url:
 defaultZone: http://127.0.0.1:8081/eureka
 server:
 enable-self-preservation: false
 eviction-interval-timer-in-ms: 5000

在這里插入圖片描述
在這里插入圖片描述

1.6.2 Privoder 集群

  服務提供者的集群配置了多個 Eureka 地址,會將自己同時注冊到多個 Eureka 上,除了配置文件以外其他的服務代碼完全一致,也可以加以區(qū)分是哪個提供的服務。需要注意的是 Eureka 集群的應用名稱可以不一致甚至不寫,但是服務提供者的應用名稱必須保持一致,否則會被認為不是一個服務。

server:
 port: 8091

spring:
 application:
 name: ProviderServer # 應用名稱,在 Eureka 中作為 id 標識

eureka:
 client:
 service-url:
 defaultZone: http://127.0.0.1:8081/eureka, http://127.0.0.1:8082/eureka
 instance:
 instance-id: provider-prim
 prefer-ip-address: true
 lease-renewal-interval-in-seconds: 1
 lease-expiration-duration-in-seconds: 2
server:
 port: 8092

spring:
 application:
 name: ProviderServer

eureka:
 client:
 service-url:
 defaultZone: http://127.0.0.1:8081/eureka, http://127.0.0.1:8082/eureka
 instance:
 instance-id: provider-back
 prefer-ip-address: true
 lease-renewal-interval-in-seconds: 1
 lease-expiration-duration-in-seconds: 2

在這里插入圖片描述

1.6.3 遠程調用

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/29
 * @description
 */
@RestController
@RequestMapping("/consumer")
public class ConsumerController {

 @Autowired
 private DiscoveryClient discoveryClient;


 @GetMapping("/go")
 public void go() {
 List<ServiceInstance> providerServer = discoveryClient.getInstances("ProviderServer");

 if (0 == providerServer.size()) {
  return;
 }

 RestTemplate restTemplate = new RestTemplate();

 for (ServiceInstance instance : providerServer) {
  System.out.print(instance.getUri() + "---");
  String url = instance.getUri() + "/provider/get";
  System.out.println(restTemplate.getForObject(url, String.class));
 }
 }
}

在這里插入圖片描述

  咱們可以使用服務發(fā)現(xiàn) DiscoveryClient 來獲取服務信息,但是無法自動選擇使用那個服務,這里就涉及到 Ribbon 負載均衡了。我們可以將 RestTemplate 交由 Ioc 管理,在注入時使用 @LoadBalanced 注解進行負載均衡。

☞ 源碼

到此這篇關于Spring Cloud 系列之注冊中心 Eureka的文章就介紹到這了,更多相關Spring Cloud 注冊中心Eureka內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java.util.Date與java.sql.Date的區(qū)別

    java.util.Date與java.sql.Date的區(qū)別

    這篇文章主要介紹了java.util.Date與java.sql.Date的區(qū)別的相關資料,需要的朋友可以參考下
    2015-07-07
  • Springboot實現(xiàn)導入導出Excel的方法

    Springboot實現(xiàn)導入導出Excel的方法

    今天帶各位小伙伴學習Springboot實現(xiàn)導入導出Excel的方法,文中有非常詳細的介紹,對正在學習java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Spring?Boot快速過濾出一次請求的所有日志

    Spring?Boot快速過濾出一次請求的所有日志

    這篇文章主要介紹了Spring?Boot快速過濾出一次請求的所有日志,本文講述了如何使用MDC工具來快速過濾一次請求的所有日志,并通過裝飾器模式使得MDC工具在異步線程里也能生效,需要的朋友可以參考下
    2022-11-11
  • Spring中Websocket身份驗證和授權的實現(xiàn)

    Spring中Websocket身份驗證和授權的實現(xiàn)

    在Web應用開發(fā)中,安全一直是非常重要的一個方面,本文主要介紹了Spring中Websocket身份驗證和授權的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Java基本數(shù)據(jù)類型族譜與易錯點梳理解析

    Java基本數(shù)據(jù)類型族譜與易錯點梳理解析

    Java有八大基本類型,很多同學只對經(jīng)常使用的int類型比較了解。有的同學是剛從C語言轉入Java學習,誤以為兩者的基本數(shù)據(jù)類型完全相同,這也是大錯特錯的。今天這本Java基本數(shù)據(jù)類型全解析大字典,可以幫助你直接通過目錄找到你想要了解某一種基本數(shù)據(jù)類型
    2022-01-01
  • SpringCache 分布式緩存的實現(xiàn)方法(規(guī)避redis解鎖的問題)

    SpringCache 分布式緩存的實現(xiàn)方法(規(guī)避redis解鎖的問題)

    這篇文章主要介紹了SpringCache 分布式緩存的實現(xiàn)方法(規(guī)避redis解鎖的問題),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java 實現(xiàn)緩存的三種方式及問題匯總

    Java 實現(xiàn)緩存的三種方式及問題匯總

    這篇文章主要介紹了Java 實現(xiàn)緩存的三種方式及問題匯總,HashMap實現(xiàn)緩存,可以實現(xiàn)簡單的本地緩存,但是實際開發(fā)中不推薦,我們可以簡單模擬一下緩存的實現(xiàn),本文通過示例代碼介紹的非常詳細,感興趣的朋友一起看看吧
    2024-03-03
  • Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息的完整代碼

    Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息的完整代碼

    kakfa是我們在項目開發(fā)中經(jīng)常使用的消息中間件。由于它的寫性能非常高,因此,經(jīng)常會碰到讀取Kafka消息隊列時擁堵的情況,這篇文章主要介紹了Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息,需要的朋友可以參考下
    2023-02-02
  • 解析Flink內核原理與實現(xiàn)核心抽象

    解析Flink內核原理與實現(xiàn)核心抽象

    Flink API提供了開發(fā)的接口,此外,為了實現(xiàn)業(yè)務邏輯,還必須為開發(fā)者提供自定義業(yè)務邏輯的能力,下面為大家解析Flink內核原理與實現(xiàn)核心抽象
    2021-08-08
  • 關于Spring Boot WebSocket整合以及nginx配置詳解

    關于Spring Boot WebSocket整合以及nginx配置詳解

    這篇文章主要給大家介紹了關于Spring Boot WebSocket整合以及nginx配置的相關資料,文中通過示例代碼給大家介紹的非常詳細,相信對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習下吧。
    2017-09-09

最新評論