SpringCloud及其五大常用組件之Eureka和Zuul


1.springcloud簡介

SpringCloud是Spring旗下的項目之一,它是微服務架構的一種實現方式。

官網地址:http://projects.spring.io/spring-cloud/

Spring最擅長的就是集成,把世界上最好的框架拿過來,集成到自己的項目中。

SpringCloud也是一樣,它將現在非常流行的一些技術整合到一起,實現了諸如:配置管理,服務發現,智能路由,負載均衡,熔斷器,控制總線,集群狀態等等功能。其主要涉及的組件包括:

Netflix:

  • Eureka:注冊中心
  • Zuul:服務網關
  • Ribbon:負載均衡
  • Feign:服務調用
  • Hystrix:熔斷器

場景模擬:

​ 現在來使用springboot創建兩個微服務,為了方便直觀,將服務的提供者命名為user-service,將服務的消費者命名為consumer-demo,我們利用這兩個微服務之間的調用,來感受一下pringcloud這個全局的治理框架的作用

2.Eureka

廢話不多說,直接上圖!

renewal:續約

  • Eureka-Server:就是服務注冊中心(可以是一個集群),對外暴露自己的地址。
  • 提供者:啟動后向Eureka注冊自己信息(地址,服務名稱等),並且定期進行服務續約
  • 消費者:服務調用方,會定期去Eureka拉取服務列表,然后使用負載均衡算法選出一個服務進行調用。
  • 心跳(續約):提供者定期通過http方式向Eureka刷新自己的狀態

首先,Eureka是一個注冊中心,和zookeeper功能類似,其中不同的一點是zookeeper是一個軟件,啟動直接可以使用,而Eureka是需要我們自己開發的。

下面對開發一個Eureka注冊中心進項簡單的解析:

1.首先一個簡單的Eureka注冊中心只需要一個依賴

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
</dependencies>

2.其次,編寫一個啟動類,該類上加上一個注解

@SpringBootApplication
@EnableEurekaServer 		//開啟Eureka注冊服務
public class EurekaServer {
	public static void main(String[] args) {
		SpringApplication.run(EurekaServer.class, args);
	}
}

3.最后,編寫該項目基本的配置文件

server:
  port: 10086					#端口號
spring:
  application:
    name: eureka-server # 應用名稱,會在Eureka中作為服務的id標識(serviceId)
eureka:
  client:
    service-url: # EurekaServer的地址,現在是自己的地址,如果是集群,需要寫其它Server的地址。
      defaultZone: http://127.0.0.1:10086/eureka	#注冊的地址,如果是集群,應該用,隔開
    register-with-eureka: false # 不注冊自己
    fetch-registry: false #不拉取服務

這樣一個簡單的Eureka就完成了,可以啟動服務,訪問http://127.0.0.1:10086,查看在該注冊中心上注冊的以及服務的基本信息。

服務的注冊(客戶端的開發):

​ Eureka開發完成之后,訪問發現沒有服務注冊到Eureka中,現在我們要讓user-serviceconsumer-demo注冊到Eureka上。

​ 第一步:在需要注冊的微服務中加入依賴

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

​ 第二步:在啟動類上添加@EnableDiscoveryClient來開啟Eureka客戶端的功能

@SpringBootApplication
@EnableDiscoveryClient // 開啟Eureka客戶端發現功能
public class UserServiceDemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(UserServiceDemoApplication.class, args);
	}
}

​ 第三步:再次訪問http://127.0.0.1:10086可以看到有兩個服務注冊到Eureka上

2.zuul

在微服務架構中,Zuul就是守門的大Boss!一夫當關,萬夫莫開!

不管是來自於客戶端(PC或移動端)的請求,還是服務內部調用。一切對服務的請求都會經過Zuul這個網關,然后再由網關來實現 鑒權、動態路由等等操作。Zuul就是我們服務的統一入口。

再來一張圖:

這可以看出Zuul在整個架構中扮演着什么樣的角色,其實zuul的主要作用有兩個:過濾(鑒權)和路由

和Eureka相同,Zuul同樣需要我們自己來開發

1.創建一個model,一個Zuul的的服務端應該導入下面這個依賴

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
</dependencies>

2.編寫啟動類,這里要注意的是要打上@EnableZuulProxy開啟zuul的網關功能

@SpringBootApplication
@EnableZuulProxy // 開啟Zuul的網關功能
@EnableDiscoveryClient//開啟Eureka的客戶端發現
public class ZuulApplication {

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

3.編寫配置文件

server:
  port: 10010 #服務端口
spring: 
  application:  
    name: api-gateway #指定服務名
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka		#配置Eureka的地址,將zuul會代理Eureka上注冊的服務
zuul:
  prefix: /api # 添加路由前綴
  routes:
    user-service: /user-service/** # 這里是映射路徑

這里的user-service在Eureka上注冊的一個服務,這里配置了他的映射路徑。路徑就要以/api/user-service開頭的請求都會被分發到該服務上。

Zuul是集成了另外一個組件負載均衡的組件Ribbon,所以,如果Eureka上有兩個名稱為user-service的服務,可以自動的進行負載均衡,默認的策略是輪詢

熔斷機制

Zuul還集成了Hystix熔斷機制。但是所有的超時策略都是走的默認值,比如熔斷的超時時間只有1S,也就是說,訪問一個服務,如果1s沒有響應,就判定為異常,我們也可以自己設置超時時間

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM