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-service
和consumer-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