01-springcloud和eureka
標簽: springcloud spring cloud java spring boot
這是本人自己記錄的springcloud知識,相應源碼在https://github.com/shijingfeng/spring-cloud-actual.git
一 什么是 Spring Cloud
Spring Cloud,基于 Spring Boot 提供了一套微服務解決方案,包括服務注冊與發現,配置中心,全鏈路監 控,服務網關,負載均衡,熔斷器等組件,除了基于NetFlix的開源組件做高度抽象封裝之外,還有一些選型 中立的開源組件。
官方譯文:構建分布式系統不用特別的復雜且避免容易出現的錯誤。Spring Cloud為常見的分布式系統模式 提供了一個簡單和可訪問的編程模型,幫助開發人員構建彈性、可靠和協調的應用程序。SpringCloud構建在 SpringBoot之上,使開發人員很容易開始工作并迅速提高生產力。
spring cloud架構圖
2 breaker dashboard 服務監控(Hystrix)
3 service registry 服務注冊(Eureka)
4 config dashboard 配置中心(springcloud config)
5 distributed tracing 服務跟蹤(springcloud sleuth)
Eureka服務的注冊與發現
問題:系統會根據業務被拆分成了很多的微服務,微服務的信息如何管理? Spring Cloud中提供服務注冊中心來管理微服務信息。
- 1. 微服務數量眾多,要進行遠程調用就需要知道服務端的ip地址和端口,注冊中心幫助我們管理這些服務 的ip和端口。
- 2. 微服務會實時上報自己的狀態,注冊中心統一管理這些微服務的狀態,將存在問題的服務踢出服務列 表,客戶端獲取到可用的服務進行調用。
Eureka介紹
Spring Cloud Eureka 是對Net?ix公司的Eureka的二次封裝,它實現了服務治理的功能,Spring Cloud Eureka 提供 Eureka Server 服務端與 Eureka Client 客戶端 ,服務端即是Eureka服務注冊中心,客戶端完成 微服務向Eureka服務的注冊與發現。
如果沒有用eureka的時候,有1000個微服務,當你要找某一個微服務時特別繁瑣。eureka服務注冊管理中心可以解決這種問題,客戶端先去eureka服務去服務查找,獲取想要的服務信息后,再去請求微服務。
EureKa采用C-S的設計架構,即包括了Eureka Server(服務端),EureKa client(客戶端/微服務)。
1.EureKa Server 提供服務注冊,各個節點啟動后,在EureKa server中進行注冊;
2 EureKa Client 是一個Java客戶端,用于和服務端進行交互,同時客戶端也是一個內置的默認使用輪詢負載均衡算法的負載均衡器。在應用啟動后,會向Eueka Server發送心跳(默認30秒)。如果EUR額卡 Server在多個心跳周期內沒有接受到某個節點的心跳,EureKa Server將會從服務注冊表中將這個服務移出(默認90秒)。
Eureka server服務注冊中心(單機版搭建)
在 src/main/resources下新建application.yml文件,配置如下:
訪問:http://localhost:6001/ ,效果如下:
微服務注冊到服務中心
4.功能測試
Eureka自我保護機制
如果長時間(90秒)沒有訪問、監測不到心跳,或者修改實例名稱,eureka啟動保護機制
什么是自我保護機制
當Eureka Server 在一定時間內(默認90秒)沒有接收到某個微服務的心跳,Eureka Server會從服務列表將此服 務實例注銷。但是如果出現網絡異常情況(微服務本身是正常的),微服務與Eureka Server之間無法正常通信, 以上行為可能變得非常危險了——因為微服務本身其實是正常的,此時本不應該注銷這個微服務。 Eureka Server有一種 “自我保護模式” 來解決這個問題——當Eureka Server在短時間內丟失過多客戶端時(可能發 生了網絡故障),此時Eureka Server會進入自保護模式,一旦進入該模式,Eureka Server就會保護服務注冊表中 的信息,不再刪除服務注冊表中的數據(也就是不會注銷任何微服務)。當網絡故障恢復后,該Eureka Server會 自動退出自我保護模式。
所以, 自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服 務和不健康的微服務都會保留),也不盲目注銷任何健康的微服務。使用自我保護模式,可以讓Eureka集群更加的 健壯、穩定。
自我保護配置
搭建集群版 Eureka Server 服務注冊中心
為了避免 Eureka Server的失效,Eureka Server 高可用環境需要部署兩個及以上Eureka Server,它們互相向對方注冊。如果在本機啟動兩個Eureka需要 注意兩個Eureka Server的端口要設置不一樣,如下圖:
- 在實際使用時Eureka Server至少部署兩臺服務器,實現高可用。
- 兩臺Eureka Server互相注冊。
- 微服務需要連接兩臺Eureka Server注冊,當其中一臺Eureka死掉也不會影響服務的注冊與發現。
- 微服務會定時向Eureka Server發送心跳,報告自己的狀態。
- 微服務從注冊中心獲取服務地址以RESTful方式發起遠程調用
創建兩個Eureka Server模塊
配置 pom.xml
將 6001 中的 pom.xml 依賴復制到 6002 模塊中
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
主啟動類
將 6001 中的主啟動類 復制到 6002 模塊中,并將類名重命名。
IP與域名綁定
1.找到 C:\Windows\System32\drivers\etc 目錄下的hosts文件
Eureka Server組成高可用,兩個Eureka Server互相向對方注冊,這里需要通過域名訪問,這里我們設置兩個Eureka Server的域名分別為 eureka6001.com、eureka6002.com。
127.0.0.1 eureka6001.com
127.0.0.1 eureka6002.com
application.yml
6001
server:
port: 6001 # 服務端口
eureka:
instance:
hostname: eureka6001.com # eureka服務端的實例名稱
client:
registerWithEureka: false # 服務注冊,false表示不將自已注冊到Eureka服務中
fetchRegistry: false # 服務發現,false表示自己不從Eureka服務中獲取注冊信息
serviceUrl: # Eureka客戶端與Eureka服務端的交互地址,集群版配置對方的地址,單機版配置自己(如果不配置則默認本機8761端口)
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#集群版
defaultZone: http://eureka6002.com:6002/eureka/
server:
enable-self-preservation: false # 禁用自我保護機制
server:
port: 6002 # 服務端口
eureka:
instance:
hostname: eureka6002.com # eureka服務端的實例名稱
client:
registerWithEureka: false # 服務注冊,false表示不將自已注冊到Eureka服務中
fetchRegistry: false # 服務發現,false表示自己不從Eureka服務中獲取注冊信息
serviceUrl: # Eureka客戶端與Eureka服務端的交互地址,集群版配置對方的地址,單機版配置自己(如果不配置則默認本機8761端口)
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#集群版
defaultZone: http://eureka6001.com:6001/eureka/
server:
enable-self-preservation: false # 禁用自我保護機制
服務提供著注冊到eureka中
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑
type-aliases-package: com.sjf # 所有Entity別名類所在包
mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
#應用名稱
application:
name: server02-product #這個很重要,這在以后的服務與服務之間相互調用一般都是根據這個name
#連接數據庫設置
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操作類型
driver-class-name: com.mysql.cj.jdbc.Driver # mysql驅動包
url: jdbc:mysql://127.0.0.1:3306/springcloud_db01?serverTimezone=GMT%2B8 # 數據庫名稱
username: root
password: 123456
dbcp2:
min-idle: 5 # 數據庫連接池的最小維持連接數
initial-size: 5 # 初始化連接數
max-total: 5 # 最大連接數
max-wait-millis: 150 # 等待連接獲取的最大超時時間
eureka:
client:
registerWithEureka: true # 服務注冊開關
fetchRegistry: true # 服務發現開關
serviceUrl: # 客戶端(服務提供者)注冊到哪一個Eureka Server服務注冊中心,多個用逗號分隔
defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka
instance:
instanceId: ${spring.application.name}:${server.port} # 指定實例ID,就不會顯示主機名了
hostname: localhost
prefer-ip-address: true #訪問路徑就會顯示成IP地址
效果測試
1. 先啟動 2個 Eureka Server 集群 (6001、6002)
智能推薦
SpringCloud--Eureka服務注冊和發現
Eureka是SpringCloud家族中的一個組件,因為它的有服務注冊和發現的機制,所以很適合用于做注冊中心。Eureka有服務端和客戶端,注冊中心作為服務端,我們提供的服務作為客戶端注冊到服務端上,由Eureka統一管理。 作為注冊中心,它內部運行機制是什么樣的?下面我就帶著下面這些問題來學習Eureka。 1.如何去開發一個集成spring cloud eureka程序? 下面就開發一個偽集...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
猜你喜歡
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...