yml配置意義


- 當Ribbon和Eureka配合使用時,會自動將虛擬主機名映射成微服務的網(wǎng)絡地址。
- yml中info可以展示一些信息
server:
port: 8000 # 指定端口
spring:
datasource: # 指定數(shù)據(jù)源
driver-class-name: com.mysql.jdbc.Driver
url: #數(shù)據(jù)庫路徑
username: #用戶名
password: #密碼
logging: # 配置日志級別,讓hibernate打印出執(zhí)行的SQL
level:
root: INFO
## INFO
info: #配置項目信息,有的文章里不帶'',不成功的就帶上''
app:
name: '@project.artifactId@'
encoding: '@project.build.sourceEncoding@'
java:
source: '@java.version@'
target: '@java.version@'
management:
security:
basic:
enabled: true#true開啟基于HTTP basic的認證
user:
name: user
password: password
mybatis:
type-aliases-package: com.itmuck.cloud.study.entity #mybatis別名配置
Eureka

Application Service 相當于本書中的服務提供者,Application Client相當于本書中的服務消費者;
Make Remote Call,可以簡單理解為調(diào)用RESTful API;
us-east-1c、us-east-1d等都是zone,它們都屬于us-east-1這個region;來源
Region和Zone
- Eureka Client是一個Java客戶端,用于簡化與Eureka Server的交互;
- Eureka Server提供服務發(fā)現(xiàn)的能力,各個微服務啟動時,會通過Eureka Client向Eureka Server進行注冊自己的信息(例如網(wǎng)絡信息),Eureka Server會存儲該服務的信息;
- 微服務啟動后,會周期性地向Eureka Server發(fā)送心跳(默認周期為30秒)以續(xù)約自己的信息。如果Eureka Server在一定時間內(nèi)沒有接收到某個微服務節(jié)點的心跳,Eureka Server將會注銷該微服務節(jié)點(默認90秒);
- 每個Eureka Server同時也是Eureka Client,多個Eureka Server之間通過復制的方式完成服務注冊表的同步;
Eureka Client會緩存Eureka Server中的信息。即使所有的Eureka Server節(jié)點都宕掉,服務消費者依然可以使用緩存中的信息找到服務提供者。
Eureka集群
為保證高可用,部署Eureka集群,yml配置文件可配置如下:
eureka:
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/,http://peer1:8761/eureka/
---
spring:
profiles: peer1
server:
port: 8761
eureka:
instance:
hostname: peer1
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2

將應用注冊到集群上,就是要改defaultZone,用逗號分隔即可,例如:
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
注冊到需要認證的Eureka Server:defaultZone修改為:http://{user}:{password}@EUREKA_HOST:PORT/eureka/
Eureka自我保護模式

Ribbon
可以通過Java @Configuration和指定@RibbonClient來配置負載均衡策略,也可以通過yml
負載均衡項目名.ribbon.NFLoadBalancerRuleClassName來指定
Feign-聲明式REST調(diào)用
為了解決上述使用RestTemplate調(diào)用參數(shù)過長難以維護的問題,關于RestTemplate,請參考RestTemplate。
整合Feign
- 創(chuàng)建FeignClient
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
- 啟動類添加@EnableFeignClients
- 修改Controller調(diào)用方式
@RestController
public class MovieController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return this.userFeignClient.findById(id);
}
}
實現(xiàn)REST調(diào)用的同時還實現(xiàn)了客戶端側(cè)的負載均衡
支持壓縮
feign.compression.request.enabled=true
feign.compression.response.enabled=true
其他詳細配置自己搜索
Feign日志
只對DEBUG級別做出響應。
logging:
level:
com.itmuch.cloud.study.user.feign.UserFeignClient: DEBUG # 將Feign接口的日志級別設置成DEBUG,因為Feign的Logger.Level只對DEBUG作出響應。
使用Feign構(gòu)造多參數(shù)請求
POST:按照SpringMVC POST+JSON請求方式書寫即可。
GET:用Map接收或者按照普通的SpringMVC多參數(shù)接收方式即可。
個人標注:使用Feign解決了使用RestTemplate時的硬編碼問題,根據(jù)服務名稱自動發(fā)現(xiàn)服務,實現(xiàn)調(diào)用。而RestTemplate則比起HTTPClient調(diào)用服務要更為簡單方便一些。
Hystrix 豪豬——容錯處理
依賴的服務不可用時,服務本身會不會被拖垮?這是我們要考慮的問題。
實現(xiàn)容錯的手段
雪崩效應
“基礎服務故障”導致“級聯(lián)故障”的現(xiàn)象稱為雪崩效應。
如何容錯
需要實現(xiàn)以下兩點:
- 為網(wǎng)絡請求設置超時。(這一點同JCIP《并發(fā)編程實戰(zhàn)》中在指定時間內(nèi)獲取對應的返回數(shù)據(jù)一例大概符合)
- 使用斷路器模式
斷路器實現(xiàn)Fast-Fail,如果服務已經(jīng)不可用,則強迫對該服務的調(diào)用快速失敗。同時,可以自動診斷依賴的服務是否恢復正常。
注意:斷路器打開一段時間后,會自動進入“半開”狀態(tài)。允許一個請求訪問依賴的服務,如果請求調(diào)用成功,關閉斷路器,否則繼續(xù)保持打開狀態(tài)。
個人標注:斷路器主要是為了提升可用性,房子雪崩效應。這一點類似集群,對應分布式中CAP(一致性,可用性,分區(qū))中的A(availability)
使用Hystrix實現(xiàn)容錯
簡介
Hystrix是一個實現(xiàn)了超時機制和斷路器模式的工具類庫,防止級聯(lián)失敗,提升系統(tǒng)可用性和容錯性。
通過一下幾點實現(xiàn)延遲和容錯:
- 包裹請求
- 跳閘機制
- 資源隔離:為每個依賴都維護了一個小型的線程池(或者信號量Semaphore)(PS:這一點可能跟Executor那幾種靜態(tài)ExecutorService方法有相似之處,現(xiàn)在還沒看過,暫且猜測一下)
- 監(jiān)控
- 回退機制
- 自我修復
整合Hystrix
啟動類添加注解@EnableCircuitBreaker或@EnableHystrix
Controller里面在方法上寫@HystrixCommand,指定屬性fallbackMethod,指定回退方法;還可以配置利用@HystrixCoProperty commandProperties
執(zhí)行回退邏輯,并不一定代表斷路器處于打開狀態(tài)。請求失敗、超市、被拒絕以及斷路器打開時都會執(zhí)行回退邏輯。
失敗率達到20次失敗/5s這個閾值才會打開。
線程隔離策略與傳播上下文
隔離策略有兩種:
- 線程隔離:HystrixCommand會在單獨的線程上執(zhí)行,并發(fā)請求受線程池中的線程數(shù)量的限制
- 信號量隔離:HystrixCommand將會在調(diào)用線程上執(zhí)行,開銷相對較小,并發(fā)請求受到信號量個數(shù)的限制
可使用execution.isolation.strategy屬性指定隔離策略。默認是Thread隔離策略。
Feign整合Hystrix
如下:
package com.itmuch.cloud.study.user.feign;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.itmuch.cloud.study.user.entity.User;
/**
* Feign的fallback測試
* 使用@FeignClient的fallback屬性指定回退類
* @author 周立
*/
@FeignClient(name = "microservice-provider-user", fallback = FeignClientFallback.class)
public interface UserFeignClient {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
/**
* 回退類FeignClientFallback需實現(xiàn)Feign Client接口
* FeignClientFallback也可以是public class,沒有區(qū)別
* @author 周立
*/
@Component
class FeignClientFallback implements UserFeignClient {
@Override
public User findById(Long id) {
User user = new User();
user.setId(-1L);
user.setUsername("默認用戶");
return user;
}
}
結(jié)合FallbackFactory重寫create()方法打印失敗原因。
為Feign禁用Hystrix:
配置@Configuration,在FeignClient引用該配置類即可。
全局禁用:yml文件配置feign.hystrix.enabled=false
Hystrix的監(jiān)控
一般項目:引入Hystrix-metrics-event-stream,訪問ip:port/hystrix.stream即可
Feign項目:引入spring-cloud-starter-hystrix依賴,啟動類加上@EnableCircuitBreaker,訪問/hystrix.stream監(jiān)控Hystrix
使用Hystrix Dashboard可視化監(jiān)控數(shù)據(jù)
添加hystrix-dashboard依賴,啟動類添加@EnableHystrixDashboard
監(jiān)控的是單個微服務。
使用Turbine聚合監(jiān)控數(shù)據(jù)
使用消息中間件收集數(shù)據(jù)
使用Zuul構(gòu)建微服務網(wǎng)關
電影買票,可能會調(diào)用多個微服務的接口(例如庫存微服務、用戶微服務、支付微服務等),才能完成一次購票的業(yè)務流程??蛻舳酥苯雍透鱾€微服務通信可能存在一些問題:
- 客戶端多次請求不同微服務,增加了客戶端的復雜性
- 存在跨域請求,在一定場景下處理相對復雜
- 認證復雜,每個微服務都需要獨立認證
- 難以重構(gòu)
- 直接訪問可能會有一定困難
以上問題可借助微服務網(wǎng)關解決。
使用微服務網(wǎng)關優(yōu)點: - 易于監(jiān)控
- 易于認證
- 減少客戶端與各個微服務直接的交互次數(shù)。
Zuul簡介
其核心是一系列的過濾器。
Zuul的路由端點
路由配置
Zuul安全與Header
Zuul文件上傳
小文件上傳(1M以內(nèi)),無需任何處理,即可正常上傳。對于大文件(10M以上)上傳,需要為上傳路徑添加/zuul前綴
Zuul的過濾器
Zuul中定義了4種標準過濾器類型:
- PRE
- ROUTING
- POST
- ERROR
編寫過濾器,繼承ZuulFilter覆寫方法,啟動類添加filter對應的@Bean即可
禁用Zuul過濾器
zuul.<SimpleClassName>.<filterType>.disable=true
Zuul的容錯與回退
實現(xiàn)ZuulFallbackProvider接口
Zuul的高可用
分兩種情況:Zuul客戶端注冊和未注冊到Eureka Server上
使用Sidecar整合非JVM微服務
非JVM微服務需要實現(xiàn)監(jiān)控檢查,status狀態(tài)常見取值有:UP/DOWN/OUT_OF_SERVICE/UNKNOWN等。
Spring Cloud Config
維護的配置管護理一般有以下需求:
- 集中管理配置。
- 不同環(huán)境不同配置。
- 運行期間可動態(tài)調(diào)整。
- 配置修改后可自動更新。
簡介
Config為分布式系統(tǒng)外部化配置提供了服務器端和客戶端的支持,它包括Config Server和Config Client兩部分。默認使用Git存儲配置內(nèi)容。
啟動類@EnableConfigServer
Actuator提供的/refresh可以實現(xiàn)手動刷新配置,在Controller上添加注解@RefreshScope
使用Spring Cloud Bus自動刷新配置
使用Spring Cloud Sleuth實現(xiàn)微服務跟蹤
使用Actuator監(jiān)控微服務實例,使用Hystrix監(jiān)控Hystrix Command,使用Sleuth實現(xiàn)微服務“跟蹤”
分布式計算的八大誤區(qū):
- 網(wǎng)絡可靠
- 延遲為零
- 帶寬無限
- 網(wǎng)絡絕對安全
- 網(wǎng)絡拓撲不會改變
- 必須有一名管理員
- 傳輸成本為零
- 網(wǎng)絡同質(zhì)化
基本在描述同一個問題——網(wǎng)絡問題。微服務之間通過網(wǎng)絡進行通信,如果跟蹤請求可以了解經(jīng)過哪些微服務、請求耗時、網(wǎng)絡延遲等指標,就可以更好的分析系統(tǒng)瓶頸。
簡介
一些術語:
- span(跨度):基本工作單元。用一個64位的id唯一標識。
- trace(跟蹤):一組共享“root span”的span組成的樹狀結(jié)構(gòu)成為trace。
- annotation(標注):annotation用來記錄事件的存在。其中,核心annotation用來定義請求的開始和結(jié)束。
- CS(client Sent客戶端發(fā)送)
- SR(Server Received服務器端接收)
- SS(Server Send服務器端發(fā)送)
- CR(client Received客戶端接收)
Spring Cloud Sleuth與ELK配合使用
與Zipkin配合使用
編寫Zipkin Server:添加以來,啟動類使用@EnableZipkinServer注解
可以查看詳細信息,還可以分析微服務之間的依賴。

Docker
Docker是一個開源的容器引擎,它有助于更快的交付應用。好處:可更快的打包、測試以及部署應用程序,并可以縮短從編寫到部署運行代碼的周期。
注解
@EnableDiscoveryClient:聲明這是一個Eureka的Client,在啟動類上加
@SpringBootApplication:啟動類注解
Feign注解:
@RequestLine("GET /{id}")
public User findById(@Param("id") Long id);
Actuator
提供了很多監(jiān)控端點,可使用http://{ip}:{port}/{endpoint}的形式訪問這些端點。

其他小知識
- RestTemplate可以請求微服務,例如:restTemplate對象.getForObject(地址,類.class)
- 服務發(fā)現(xiàn)組件:Eureka,Zookeeper,Consul
- 啟動同一個微服務的多個實例:
- 打包
- java -jar jar包名 --server.port=8001更改port啟動即可
- 負載均衡器:Nginx、HAProxy、F5等
- JCE(Java Cryptography Extension)
看完這本書后,可以了解一下拜托!面試請不要再問我Spring Cloud底層原理
