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

微服務架構之服務注冊與發(fā)現(xiàn)實踐示例詳解

 更新時間:2022年01月30日 11:28:11   作者:Brand  
這篇文章主要為大家介紹了微服務架構之服務注冊與發(fā)現(xiàn)實踐的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

微服務系列前篇

詳解微服務架構及其演進史

微服務全景架構全面瓦解

微服務架構拆分策略詳解

微服務架構之服務注冊與發(fā)現(xiàn)功能詳解

1 服務注冊中心

前面我們對業(yè)內(nèi)幾種比較常見的注冊中心做了介紹:Eureka、Zookeeper、Consul、Etcd。

并且在各個指標上做了對比:注冊方式(watch\polling)、健康檢查、雪崩保護、安全與權限,以及在Spring Cloud、Dubbo、Kubernets上的支持程度。方便我們在不同的場景下做正確的技術選型。

4種注冊中心技術對比

指標EurekaZookeeperConsulEtcd
一致性協(xié)議APCP(Paxos算法)CP(Raft算法)CP(Raft算法)
健康檢查TTL(Time To Live)TCP Keep AliveTTL\HTTP\TCP\ScriptLease TTL KeepAlive
watch/long polling不支持watchlong pollingwatch
雪崩保護支持不支持不支持不支持
安全與權限不支持ACLACLRBAC
是否支持多數(shù)據(jù)中心
是否有管理界面否(可用第三方ZkTools)
Spring Cloud 集成支持支持支持支持
Dubbo 集成不支持支持支持不支持
K8S 集成不支持不支持支持支持

我們可以看出,四種技術類型對Spring Cloud的支持度都很高。Spring Cloud是微服務架構的一站式解決方案,我們平時構建微服務的過程中需要做的的如 配置管理、服務發(fā)現(xiàn)、負載均衡、斷路器、智能路由、控制總線、全局鎖、決策競選、分布式會話和集群狀態(tài)管理等操作。Spring Cloud 為我們提供了一套簡易的編程模型,使我們能在 Spring Boot 的基礎上輕松地實現(xiàn)微服務項目的構建。

Spring Cloud包含了多個不同開源產(chǎn)品,來保證一站式的微服務解決方案,如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項目。

2 Spring Cloud 框架下實現(xiàn)

Spring Cloud為服務治理做了一層抽象,這樣能夠支持多種不同的服務治理框架,比如:Netflix Eureka、Consul。我們這邊就以這兩個為例子,看看服務治理是如何實現(xiàn)。

在Spring Cloud服務治理抽象層的作用下,可以無縫地切換服務治理實現(xiàn),且不影響任何其他的服務注冊、發(fā)現(xiàn)、調(diào)用邏輯。

所以,下面我們通過介紹這兩種服務治理的實現(xiàn)來體會Spring Cloud這一層抽象所帶來的好處。

2.1 Spring Cloud Eureka

Spring Cloud Eureka是Spring Cloud Netflix項目下的服務治理模塊。而Spring Cloud Netflix項目是Spring Cloud的子項目之一,主要內(nèi)容是對Netflix公司一系列開源產(chǎn)品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。

通過一些簡單的注解,開發(fā)者就可以快速的在應用中配置一下常用模塊并構建龐大的分布式系統(tǒng)。它主要提供的模塊包括:服務發(fā)現(xiàn)(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負載均衡(Ribbon)等。

下面,就來具體看看如何使用Spring Cloud Eureka實現(xiàn)服務治理。

2.1.1 創(chuàng)建注冊中心

創(chuàng)建一個Spring Cloud項目,我們命名為micro-service-center,并在pom.xml中引入需要的依賴內(nèi)容:

<packaging>pom</packaging> 

表明這個項目中可以沒有Java代碼,也不執(zhí)行任何代碼,只是為了聚合工程或者傳遞依賴,所以可以把src文件夾刪了。這是一個父級項目,因為我們還要在下面建立Eureka的注冊中心、客戶端等多個子項目 。

在micro-service-center下,新建一個命名為 eureka-service 的Module,依舊是Spring Cloud 項目,建完之后,pom.xml做如下改動:

 <!--    在子工程中添加父工程名稱-->
 <parent>
      <groupId>com.microservice</groupId>
      <artifactId>center</artifactId>
      <version>1.0.0</version>
 </parent>
  
  
  <dependencies>
 <!--   加入 eureka 服務 -->
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
          </dependency>
 </dependencies>

改完之后,回到父項目micro-service-center,修改pom中的信息:

<groupId>com.microservice</groupId>
  <artifactId>center</artifactId>
  <packaging>pom</packaging>
  <version>1.0.0</version>
  <name>center</name>
  <description>Demo project for Spring Boot</description>
  <!--    在父工程添加子工程名稱-->
  <modules>
    <module>eureka-service</module>
    <module>eureka-client</module>
  </modules>

對兩個項目進行clean + install,應該是成功的。

eureka-service我們是作為注冊中心來用的,所以在它的主類Application中加入@EnableEurekaServer注解,就能開啟注冊中心功能。

 @SpringBootApplication
 @EnableEurekaServer
 public class ServiceApplication {
     public static void main(String[] args) {
         SpringApplication.run(ServiceApplication.class, args);
         System.out.println("Start Eureka Service");
     }
 

但是默認情況下,該注冊中心也會把自己當做客戶端,那就變成自己注冊自己了,這個是可以剔除的,我們看一下它的YAML中的詳細配置,注釋比較清楚:

server:
   port: 1000
 spring:
   application:
     name: eureka-server
 eureka:
   instance:
     hostname: localhost
   client:
     register-with-eureka: false  # 不作為客戶端進行注冊
     fetch-registry: false  # 不獲取注冊列表
     service-url:  # 注冊地址,客戶端需要注冊到該地址中
       defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

文中的注釋還是比較清楚的。 這邊可以看到,端口號是1000,所以當工程啟動之后,訪問 http://localhost:1000/ 是可以看到Eureka注冊中心頁面的。其中還沒有發(fā)現(xiàn)任何服務。

2.1.2 創(chuàng)建客戶端

目前服務中心還是空的,所以我們創(chuàng)建一個能夠提供服務的客戶端,并將其注冊到注冊中心去。

同樣的,我們創(chuàng)建一個Spring Cloud的子項目,命名為eureka-clientpom.xml中的配置如下:

<!--    在子工程中添加父工程名稱-->
 <parent>
     <groupId>com.microservice</groupId>
     <artifactId>center</artifactId>
     <version>1.0.0</version>
 </parent>
 <dependencies>
 
 <!--    加入 eureka 服務 -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-netflix-eureka-server</artifactId>
 </dependency>
 
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
 </dependency>
 
 </dependencies>

在應用主類Application文件中通過加上@EnableDiscoveryClient注解,該注解保證當前服務被Eureka當成provider發(fā)現(xiàn)。

 @SpringBootApplication
 @EnableDiscoveryClient
 public class ClientApplication {
     public static void main(String[] args) {
         SpringApplication.run(ClientApplication.class, args);
         System.out.println("start client!");
     }
 

在YAML文件上加上如下配置:

 server:
   port: 1001
 spring:
   application:
     name: eureka-client
 eureka:
   client:
     service-url:  # 這邊就保證了注冊到 eureka-service 這個注冊中心去
       defaultZone: http://localhost:1000/eureka

spring.application.name屬性,指定了微服務的名稱,在調(diào)用的時候可以通過該名稱進行服務訪問。eureka.client.serviceUrl.defaultZone屬性對應服務注冊中心的配置內(nèi)容,指定服務注冊中心的位置。

大家看到,這邊端口設置為1001,那是因為要在本機上測試 服務提供方 和 服務注冊中心,所以server的port屬性需設置不同的端口。

最后,我們再寫一個接口,通過DiscoveryClient對象,在客戶端中獲取注冊中心的所有服務信息。

@Controller
 @RequestMapping("/eurekacenter")
 public class EuServiceController {
     @Autowired
     DiscoveryClient discoveryClient;
     /**
      * 獲取注冊服務信息
      */
     @RequestMapping(value = "/service", method = {RequestMethod.GET})
     @ResponseBody
     public String getServiceInfo() {
        return  "service:"+discoveryClient.getServices()+" , memo:"+discoveryClient.description();
     }
 

這時候跑一下試試看,繼續(xù)訪問之前的地址:http://localhost:1000/ ,可以看到Eureka注冊中心頁面已經(jīng)包含一個我們定義的服務了,就是上面新建的 1001 端口的服務。

同樣,我們可以調(diào)用上面的那個獲取注冊服務信息的接口,從服務發(fā)現(xiàn)的角度看看有多少個服務被注冊到注冊中心去。 http://localhost:1001/eurekacenter/service

如上圖所示,方括號中的eureka-client通過Spring Cloud定義的 getServiceInfo 接口在eureka的實現(xiàn)中獲取到的所有服務清單,他是一個String的List,如果注冊了多個提供者,就會全部顯示。

2.2 Spring Cloud Consul

Consul 用于實現(xiàn)分布式系統(tǒng)的服務發(fā)現(xiàn)與配置。與其它分布式服務注冊與發(fā)現(xiàn)的方案,Consul 的方案更具“一站式”特征,內(nèi)置了服務注冊與發(fā)現(xiàn)框 架、分布一致性協(xié)議實現(xiàn)、健康檢查、Key/Value 存儲、多數(shù)據(jù)中心方案,不再需要依賴其它工具(比如 ZooKeeper 之類的)。

而Spring Cloud Consul ,是將其作為一個整體,在微服務架構中為我們的基礎設施提供服務發(fā)現(xiàn)和服務配置的工具。

2.2.1 Consul 的優(yōu)勢

  • 1、使用 Raft 算法來保證一致性, 比復雜的 Paxos 算法更直接。
  • 2、支持多數(shù)據(jù)中心,內(nèi)外網(wǎng)的服務采用不同的端口進行監(jiān)聽。 多數(shù)據(jù)中心集群可以避免單數(shù)據(jù)中心的單點故障,而其部署則需要考慮網(wǎng)絡延遲, 分片等情況等。 zookeeper 和 etcd 均不提供多數(shù)據(jù)中心功能的支持,上面表格中有體現(xiàn)。
  • 3、支持健康檢查。 
  • 4、支持 http 和 dns 協(xié)議接口。 zookeeper 的集成較為復雜, etcd 只支持 http 協(xié)議。
  • 5、官方提供 web 管理界面, etcd 無此功能。

2.2.2 Consul的特性

  • 1、服務發(fā)現(xiàn)
  • 2、健康檢查
  • 3、Key/Value存儲
  • 4、多數(shù)據(jù)中心

2.2.3 安裝Consul注冊中心

1、官方下載64版本 :https://www.consul.io/downloads.html

2、解壓后復制到目錄 /usr/local/bin 下

3、啟動終端,先看下啥版本的

 wengzhihua@B000000147796DS ~ % consul --version
 Consul v1.10.4
 Revision 7bbad6fe
 Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

4、執(zhí)行安裝命令,可以看到他的 Client Addr 的端口為8500。所以訪問 8500端口站點,http://127.0.0.1:8500/ui/dc1/services

wengzhihua@B000000147796DS ~ % consul agent -dev
 ==> Starting Consul agent...
            Version: '1.10.4'
            Node ID: '6db154b4-62ff-e67d-e745-1a7270fa1ce8'
          Node name: 'B000000147796DS'
         Datacenter: 'dc1' (Segment: '<all>')
             Server: true (Bootstrap: false)
        Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
       Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
            Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

我們可以看到,現(xiàn)在沒有客戶端注冊上來,只有一個自身的實例。

2.2.4 創(chuàng)建服務提供者

由于Spring Cloud Consul項目的實現(xiàn),我們可以輕松的將基于Spring Boot的微服務應用注冊到Consul上,并通過此實現(xiàn)微服務架構中的服務治理。

我們在micro-service-center下新建一個cloud項目consul-client,該項目pom文件添加如下:

<!--    在子工程中添加父工程名稱-->
 <parent>
     <groupId>com.microservice</groupId>
     <artifactId>center</artifactId>
     <version>1.0.0</version>
 </parent>
 
 <dependencies>
 <!--        Consul服務發(fā)現(xiàn)-->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-consul-discovery</artifactId>
 </dependency>
 <!--        Consul健康檢查-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>
 </dependencies

然后修改一下application.yml的配置信息,將consul配置寫入,注釋應該很清楚了,如下:

spring:
  application:
    name: consul-producer # 當前服務的名稱
  cloud:
    consul: # 以下為Consuk注冊中心的地址,如果安裝的不是這個host和port,這邊可以調(diào)整
      host: localhost
      port: 8500
server:
  port: 8501 # 當前服務的端口

同樣的,我們要在應用主類Application文件中通過加上@EnableDiscoveryClient注解,該注解保證當前服務被Consul當成provider發(fā)現(xiàn)。

大家看到這個做法跟Eureka一樣,因為Spring Cloud對服務治理做的一層抽象,所以可以屏蔽Eureka和Consul服務治理的實現(xiàn)細節(jié),

程序上不需要做改變,只需要引入不同的服務治理依賴,并配置相關的配置屬性 就能輕松的將微服務納入Spring Cloud的各個服務治理框架中。

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

修改完成之后,我們就可以把這個服務提供者啟動了,然后再去注冊中心查看服務的注冊情況,就可以看到被注冊進來的Provider(consul-producer):

3 總結

除了 Eureka、Consul,還有其他的的注冊中心技術,如Zookeeper、Nocas等。但無論何種注冊中心技術,本質(zhì)上都是為了解決微服務中的如下問題:

解耦服務之間相互依賴的細節(jié)

我們知道服務之間的遠程調(diào)用必須要知道對方的IP、端口信息。我們可以在調(diào)用方直接配置被調(diào)用方的IP、端口,這種調(diào)用方直接依賴IP、端口的方式存在明顯的問題,如被調(diào)用的IP、端口變化后,調(diào)用方法也要同步修改。 

通過服務發(fā)現(xiàn),將服務之間IP與端口的依賴轉化為服務名的依賴,服務名可以根據(jù)具微服務業(yè)務來做標識,因此,屏蔽、解耦服務之間的依賴細節(jié)是服務發(fā)現(xiàn)與注冊解決的第一個問題。 

對微服務進行動態(tài)管理

在微服務架構中,服務眾多,服務之間的相互依賴也錯綜復雜,無論是服務主動停止,意外掛掉,還是因為流量增加對服務實現(xiàn)進行擴容,這些服務數(shù)據(jù)或狀態(tài)上的動態(tài)變化,都需要盡快的通知到被調(diào)用方,被調(diào)用方才采取相應的措施。因此,對于服務注冊與發(fā)現(xiàn)要實時管理者服務的數(shù)據(jù)與狀態(tài),包括服務的注冊上線、服務主動下線,異常服務的剔除。

以上就是微服務架構之服務注冊與發(fā)現(xiàn)實踐示例詳解的詳細內(nèi)容,更多關于微服務注冊與發(fā)現(xiàn)實踐的資料請關注腳本之家其它相關文章!

相關文章

  • Cache-control使用Cache-control:private學習筆記

    Cache-control使用Cache-control:private學習筆記

    網(wǎng)頁緩存由 HTTP消息頭中的Cache-control控制,常見取值有private、no-cache、max-age、must- revalidate等,默認為private
    2013-02-02
  • 使用?Koa?+?TS?+?ESLlint?搭建node服務器的過程詳解

    使用?Koa?+?TS?+?ESLlint?搭建node服務器的過程詳解

    這篇文章主要介紹了使用?Koa?+?TS?+?ESLlint?搭建node服務器,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • DNSLOG平臺搭建及其原理解析

    DNSLOG平臺搭建及其原理解析

    DNSlog就是存儲在DNS Server上的域名訪問信息,它記錄著用戶對域名littlehann.com等的訪問信息,類似日志文件,這篇文章主要介紹了DNSLOG平臺搭建及其原理分析 ,需要的朋友可以參考下
    2024-01-01
  • 華為RAID 1陣列卡設置教程圖文詳解

    華為RAID 1陣列卡設置教程圖文詳解

    這篇文章主要介紹了華為RAID 1陣列卡設置教程圖文詳解,需要的朋友可以參考下
    2016-04-04
  • Samba服務器的配置與管理教程(保姆級)

    Samba服務器的配置與管理教程(保姆級)

    在Linux中,大家聽的最多的可能就是Samba服務,什么是Samba呢,下面小編就來和大家聊聊Samba服務器的配置與管理,感興趣的小伙伴可以了解一下
    2023-09-09
  • Git發(fā)現(xiàn)git push origin master 報錯的解決方法

    Git發(fā)現(xiàn)git push origin master 報錯的解決方法

    本篇文章主要介紹了Git發(fā)現(xiàn)git push origin master 報錯的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • SVN服務器搭建圖文教程

    SVN服務器搭建圖文教程

    這篇文章主要為大家詳細介紹了SVN服務器搭建的圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 簡單粗暴的Caddy Server 使用介紹

    簡單粗暴的Caddy Server 使用介紹

    Caddy是一個Go寫的服務器軟件,官方的宣傳語The HTTP/2 web server with automatic HTTPS以及Serve The Web Like It is 2016簡明表達了這個軟件的優(yōu)點和趨勢,它擁有基本的apache或者nginx有的web server模塊,同時還有一些很有特色的功能
    2016-11-11
  • RSync實現(xiàn)文件同步備份配置詳解

    RSync實現(xiàn)文件同步備份配置詳解

    rsync實現(xiàn)網(wǎng)站的備份,文件的同步,不同系統(tǒng)的文件的同步,如果是windows的話,需要windows版本cwrsync
    2013-05-05
  • 碼云(gitee)通過git自動同步到阿里云服務器

    碼云(gitee)通過git自動同步到阿里云服務器

    當我們想要實現(xiàn)幾個小伙伴合作開發(fā)同一個項目,或者建立一個資源分享平臺的時候,GIT就是一個很好的選擇。這篇文章主要介紹了碼云(gitee)通過git自動同步到阿里云服務器
    2022-12-12

最新評論