《SpringCloud docker》讀書筆記

yml配置意義

image.png

image.png
  • 當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

Eureka架構(gòu)圖

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
啟動Eureka集群的命令

將應用注冊到集群上,就是要改defaultZone,用逗號分隔即可,例如:

eureka:
    client:
      serviceUrl:
        defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

注冊到需要認證的Eureka Server:defaultZone修改為:http://{user}:{password}@EUREKA_HOST:PORT/eureka/

Eureka自我保護模式

image.png

Ribbon

可以通過Java @Configuration和指定@RibbonClient來配置負載均衡策略,也可以通過yml
負載均衡項目名.ribbon.NFLoadBalancerRuleClassName來指定

Feign-聲明式REST調(diào)用

為了解決上述使用RestTemplate調(diào)用參數(shù)過長難以維護的問題,關于RestTemplate,請參考RestTemplate。

整合Feign

  1. 創(chuàng)建FeignClient
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
  @RequestMapping(value = "/{id}", method = RequestMethod.GET)
  public User findById(@PathVariable("id") Long id);
}
  1. 啟動類添加@EnableFeignClients
  2. 修改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這個閾值才會打開。

線程隔離策略與傳播上下文

隔離策略有兩種:

  1. 線程隔離:HystrixCommand會在單獨的線程上執(zhí)行,并發(fā)請求受線程池中的線程數(shù)量的限制
  2. 信號量隔離: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注解
可以查看詳細信息,還可以分析微服務之間的依賴。


image.png

Docker

Docker是一個開源的容器引擎,它有助于更快的交付應用。好處:可更快的打包、測試以及部署應用程序,并可以縮短從編寫到部署運行代碼的周期。

注解

@EnableDiscoveryClient:聲明這是一個Eureka的Client,在啟動類上加
@SpringBootApplication:啟動類注解
Feign注解:
@RequestLine("GET /{id}")
public User findById(@Param("id") Long id);

Actuator

提供了很多監(jiān)控端點,可使用http://{ip}:{port}/{endpoint}的形式訪問這些端點。


image.png

其他小知識

  • RestTemplate可以請求微服務,例如:restTemplate對象.getForObject(地址,類.class)
  • 服務發(fā)現(xiàn)組件:Eureka,Zookeeper,Consul
  • 啟動同一個微服務的多個實例:
  1. 打包
  2. java -jar jar包名 --server.port=8001更改port啟動即可
  • 負載均衡器:Nginx、HAProxy、F5等
  • JCE(Java Cryptography Extension)

看完這本書后,可以了解一下拜托!面試請不要再問我Spring Cloud底層原理

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容