目錄:html
springcloud費話之Eureka服務訪問(restTemplate)面試
springcloud費話之Eureka接口調用(feign)spring
springcloud費話之斷路器(hystrix in feign)docker
springcloud費話之配置中心基礎(SVN)apache
懂分佈式的理論和作過度布式(多年前),卻感受在當下的面試對於springcloud要求太多springboot
做爲一個微服務分佈式的架構,標準造成的太多又太快,不少東西不用去關心了,確實方便了一些,然而,並不是全部公司都有相似的項目服務器
或者說並不是全部人都有相關的項目經驗
多說無用,累
springcloud是什麼?本身去找吧
1、Eureka是什麼?咋用的,什麼地位呢?
在一個分佈式架構中,都會涉及到負載均衡和集羣,最先出現的時候,我肯定有10臺機器做爲集羣,那麼就知道這10臺機器的ip和端口,因而乎
會將10臺機器的ip和端口都寫在須要調用的代碼中,輪詢使用,造成最先期的負載均衡了。
然而,當下來講,雲服務和虛擬機比較廣泛,又能夠用docker進行容器化,細分割,服務微小化,解耦和獨立運做性更強,同時還要兼顧集羣的
橫向擴容,因而,集羣中一共有幾臺服務器,每臺服務器的配置如何,就是一個變數,所以須要一個服務的註冊和發現的中心了。
Eureka本意爲:發現的驚歎感受,的意思。固然是用的是springboot爲基礎,通信協議是用的依然是http,對於其心跳機制來肯定每一臺服務器的
健康情況,這些咱們沒必要在乎,同時新的Eureka客戶端會請求Eureka服務器,告訴對方本身來了,自動添加進集羣,因而集羣中就多了一員。
這種標準的服務發現和註冊機制,造成的標準化結構,即爲Eureka了。
2、Eureka的原理和做用
如下圖爲盜用,有意見聯繫我(我會重畫一張同樣的!!!)
一個Eureka集羣,簡單的分爲Eureka服務器(Eureka Server)和Eureka客戶端(Eureka Client)兩個部分。
其中Eureka服務器一般爲2臺或者以上,最好進行物理分離,以達到整個集羣容災的效果。提升可用性,下降總體掛掉的可能性。
Eureka客戶端,實際上就是應用,每一個應用都寫在客戶端中,客戶端數量爲多個,那麼每次請求的時候,只要知道客戶端的名稱,
便可以從Eureka服務器中或者該客戶端的每一個地址,選擇一個進行調用,即完成了集羣的請求。
那麼具體要選擇哪個,爲什麼不少示例代碼中都是從該客戶端數組List中只取(0)第一個來使用呢?
那只是示例代碼,別太當真。若是該服務是須要集羣中的一個服務器來解決,那麼選擇任意一個,都是能夠的,第幾個,能夠用
隨機數來計算得出。若是請求全部,能夠理解爲一種分佈式了,好比10個客戶端,每一個去進行一個任務隊列的十分之一,再將結果
整合回來統計,這東西和大數據的併發請求方式實際上就是一個東西了。
3、Eureka的上手
一、版本
首先找到spring的官網,找到Eureka的示例,在https://spring.io/projects中找到springcloud,而後在地步找到quick start,操做如圖,
在下面展開的選項卡中找到Eureka server,以下圖
而後點擊 頁面最下方的
獲得內容以下圖:
應用此信息修改pom,修改內容包括:parent,dependency,刪掉junit,我通過修改後的pom以下:
只貼了server的pom,其中client的依賴也在其中,注意註釋
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.lyh</groupId> <artifactId>lyh-eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>lyh-eureka-server</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <!-- SR2會報錯,未解決 --> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- web的jar --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- eureka server的jar, 做爲client也須要 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- eureka client的jar --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.配置文件
建立resources而且buildpath,編寫application.yml配置文件,以下:
server的yml
server:
port: 9010
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eureka-server
client的yml
server:
port: 9020
eureka:
client:
serviceUrl:
defaultZone: http://localhost:9010/eureka/
spring:
application:
name: eureka-client
3.server和client的啓動類
編寫server的啓動類,代碼以下:
package com.lyh.lyh_eureka_server;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaServerRun { public static void main(String[] args) { SpringApplication.run(EurekaServerRun.class, args); } }
編寫client的啓動來,代碼以下:
package com.lyh.lyh_eureka_server;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class EurekaClientRun { public static void main(String[] args) { SpringApplication.run(EurekaClientRun.class, args); } }
4.啓動並訪問
先啓動server,而後啓動client,訪問server的地址:http://localhost:9010,結果以下圖則爲正確:
5.一些問題
client的name註冊入server的時候,會自動轉爲大寫
紅字表示client的心跳維持時間在90秒以上,將會自動刪除該註冊,是一種server的保護機制
將server中的yml自我保護機制修改,配置文件修改以下:
server:
port: 9010
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
enable-self-preservation: false
spring:
application:
name: eureka-server
修改之後,頁面提示會發生變化,表示保護機制已經關閉,以下圖
以上!