微信搜索逆鋒起筆
關注後回覆編程pdf
領取編程大佬們所推薦的 23 種編程資料!php
SpringCloud 官網:https://spring.io/projects/spring-cloud(我的建議是用谷歌瀏覽器訪問官網打開中文翻譯粗略把官網讀一遍)我的理解:之前的服務器就好像,一個會語數外全能的老師,爲學生提供服務,這個老師生病了,那全校停課。如今微服務流行後,學校有了數學教研組,語文教研組,外語教研組,每一個教研組有一羣老師具體負責某科的教學,缺了誰,學校都照樣運轉。而這個變化中,那些改變歷史的程序員就是把一個服務器中的衆多服務,或好幾臺服務器中的衆多服務,分類出來,解耦合出來,把他們相似的功能交給同一個集羣來作,把互相耦合在一塊兒的功能剝離出來,按業務,按功能來把他們做爲一個個微服務放在服務器上,而這個服務器就只提供一個服務,或較少的服務。讓一個超大的服務邏輯,解耦合爲一個個小服務,均勻的分佈在各自的服務器中。微服務就微在這。每一個教研組就是一個微服務集羣。他們提供一樣的服務,而註冊中心Eureka就是這個存放這個教研組老師名單的地方,學生們想先訪問這個註冊中心獲取教師名單,而後根據相應的負載方法去訪問各自老師。不至於讓集羣中某一老師累死也不至於讓某一老師閒死。而Zuul網關呢,就是學校的門衛,某些學生來學校找誰,它負責指引(路由),而且經過一些很是簡單的配置,達到阻攔一些人進入(身份驗證),或者控制想學數學的人只能去數學教研組,不能去核能教研組學怎麼造原子彈(權限驗證)。那Hystrix熔斷器呢,能夠把它當成學校的志願者,當一個教研組集體罷課後,學生找不到老師了,這些志願者及時的告訴來訪問的學生,相應的結果,異常信息等,省得大量的學生在學校等待,這些志願者趕快把這些等待的學生梳理出去,學生一直在學校等待,那其餘須要學生的學校,也會等待學生,最後形成大面積的學校癱瘓。這裏學生咱們當作一個個請求。熔斷器就是把某事故的蔓延即便熔斷了。固然這些組件也是微服務須要註冊到Eureka註冊中心那SpringCloud就能夠當作是這個學校了。衆多上面提到的組件至關於都是這個學校的各職能部門。java
ps: 博主基於Maven+idea搭建。另外SpringCloud須要基於springboot搭建。引入Spring Boot相關依賴:這裏的springboot用的是1.5.7版本;引入Spring Cloud相關依賴:這裏爲 Edgware.SR5程序員
在Idea中建立工程:File -> New ->Project點擊 Empty Project -> Next
項目命名 -> 項目位置
選擇模組 modules ->next
進入新的窗口後,開始配置Maven,打開設置 setting
由於我以前作過配置,所以只須要改變框1的路徑,如第一次配置須要本身找到你maven放置的位置,以及settings.xml,repository的位置,實在不會的百度 maven集成idea
3個框選擇完畢後點擊 ok接下來新建module
這裏可能會出現加載不出archetype list的問題
用了網上的全部解決辦法花了3個小時解決都沒用,重啓以後居然能夠了····你敢信?????小時候網吧網管的至理名言都忘了!!重啓一下嘛!!出來以後 選擇quickstart ->下一步
名字本身想 想好後,複製一下你想好的 ArtifactId點擊Next,groupId爲組織名 也是本身想一個,通常爲公司網址反寫。
粘貼後下一步web
提供註冊服務的服務器pom.xml配置以下:<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>com.yun</groupId>
<artifactId>springcloud-eureka-server</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springcloud-eureka-server</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--引入springboot-parent父項目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
<dependencies>
<!--引入springcloud的euekea server依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--指定下載源和使用springcloud的版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
點擊Import Changes等待右下角加載springcloud的依賴
算法
建立resources文件夾並設置做爲資源根目錄,以後文件變成這樣spring
以後文件夾變成有黃色的橫槓 在resources下新建文件,文件名爲application.yml (對是yml 不是xml ,博主第一次學習時,還覺得是其餘博主打錯了,踩了一個小坑)
配置yml,注意:若是隻配置前兩行端口號信息會報錯
server:
port: 8700 # 端口本身決定
# 指定當前eureka客戶端的註冊地址,也就是eureka服務的提供方,當前配置的服務的註冊服務方
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
register-with-eureka: false #自身 不在向eureka註冊
fetch-registry: false #啓動時禁用client的註冊
instance:
hostname: localhost
#指定應用名稱
spring:
application:
name: eureka-server知識補充:開發springboot的入口類 EurekaServerApplication.java
EurekaServerApplication.javapackage com.yun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //當前使用eureka的server
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}右鍵運行當前類:運行成功console畫面
嘗試進入eureka管理界面 端口號爲 yml裏配置的(端口號本身設置 須要大於公用和保留的端口號)1024~65535通常我喜歡設置爲 8700到8800之間以下 管理界面已經能夠登陸了。
apache
一樣新建module,選擇quickstart點擊下一步兩個位置 置空
取名 下一步
注意這裏要在根目錄springcloud 下建立模組,content root 會默認在以前的模組之下建立模組 這樣建立模組會出現問題並報錯
推薦這種配置方法 在content root下springcloud後更名字 以下圖配置點下一步,紅框處通常默認爲上一個模組的文件目錄名,須要改成你的模組名
成功後爲並列狀態,如不爲並列或報錯請從新配置
配置servicesupport的pom,與server的pom配置相同,只須要把第一個pom的1的方框處server改成client和第一個微服務同理 咱們須要配置入口類 pom.xml application.yml,由於是服務提供者,這裏還需編寫服務類controllerapplication.ymlserver:
port: 8701 # 服務提供方
# 指定當前eureka客戶端的註冊地址,
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:8700/eureka
instance:
hostname: localhost
#當前服務名稱
spring:
application:
name: eureka-servicepom.xml:編寫所提供的 服務controller:package com.yun;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/Hello")
public class Controller {
@RequestMapping("/World")
public String helloWorld(String s){
System.out.println("傳入的值爲:"+s);
return "傳入的值爲:"+s;
}
}入口類 並運行此微服務:package com.yun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient//表明本身是一個服務提供方
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class,args);
}
}右鍵入口類名點擊 run(固然開啓此服務時須要先開啓server服務 就是咱們第一個編寫的微服務)此時再進入服務註冊的頁面 http://localhost:8700/能夠看見服務提供者已被註冊進 服務註冊者
在直接訪問一下服務提供者的 網絡位置http://localhost:8701/Hello/World?s=小沛咱們已經看見 能夠訪問了,證實此微服務可用。
可是咱們通常不直接調用所需的微服務,而是通過提供註冊服務的服務器server,獲取所需的服務提供者列表(爲一個列表,此列表包含了能提供相應服務的服務器),他們也許是個集羣,所以server會返回一個 ip+端口號的表,服務消費者經過相應算法訪問這表上的不一樣服務器,這些服務器提供的是相同的服務,這種在服務消費者一方挑選服務器爲本身服務的方式是一種客戶端的負載均衡。目前博主所知的有 輪詢和隨機兩種方式 訪問這些服務器,輪詢就是循環的意思,假若有3臺服務器,訪問方式就是1,2,3,1,2,3,1,2,3····,隨機就是隨機,回想一下random方法,一種無規律的方式。這兩種方式都是爲了,訪問每一個服務器的可能性儘可能的相同。還有權重負載這種算法,意思就是 根據服務器負載能力的分配相應的服務。能力大的幹得多。能力小的幹得少。編程
第一種調用方式:restTemplate+ribbon
第二種調用方式:feign
ribbon是一種負載均衡的客戶端,它是什麼呢?請詳讀https://www.jianshu.com/p/1bd66db5dc46能夠看見其中的一段以下:瀏覽器
而客戶端負載均衡和服務端負載均衡最大的不一樣點在於上面所提到服務清單所存儲的位置。在客戶端負載均衡中,全部客戶端節點都維護着本身要訪問的服務端清單,而這些服務端端清單來自於服務註冊中心,好比上一章咱們介紹的Eureka服務端。同服務端負載均衡的架構相似,在客戶端負載均衡中也須要心跳去維護服務端清單的健康性,默認會建立針對各個服務治理框架的Ribbon自動化整合配置,好比Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration。在實際使用的時候,咱們能夠經過查看這兩個類的實現,以找到它們的配置詳情來幫助咱們更好地使用它。
接下來咱們來搭建基於ribbon的客戶端,他用於消費服務。同理先搭建springboot的環境與以前搭建servicesupport不一樣的是:第一步:如今pom中須要在dependencies中添加ribbon依賴 <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>第二步:yml以下配置:server:
port: 8702 # 服務消費方
# 指定當前eureka客戶端的註冊地址,
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:8700/eureka
instance:
hostname: localhost
#當前服務名稱
spring:
application:
name: eureka-consumer服務的消費方依舊須要在註冊方8700端口去註冊。配置當前服務消費方的端口8072,名字爲eureka-consumer第三步:依舊須要啓動類,由於它是一個springboot的架構:package com.yun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //當前使用eureka的server
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class,args);
}
}如上圖:咱們須要一個controller類來編寫ribbon的代碼。package com.yun.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/Hello")
class ConsumerController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/Consumer")
public String helloWorld(String s){
System.out.println("傳入的值爲:"+s);
//第一種調用方式
//String forObject = new RestTemplate().getForObject("http://localhost:8071/Hello/World?s=" + s, String.class);
//第二種調用方式
//根據服務名 獲取服務列表 根據算法選取某個服務 並訪問某個服務的網絡位置。
//ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
//String forObject = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/Hello/World?s="+s,String.class);
//第三種調用方式 須要restTemplate注入的方式
String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
return forObject;
}
}咱們經常使用第三種調用方式。第一種是直接調用:不通過註冊中心那服務列表,直接訪問的servicesupport第二種:是根據服務名選擇調用,如上圖須要作以下注入緩存
@Autowired private LoadBalancerClient loadBalancerClient;
如上圖代碼中第二種調用方法的代碼所示。用服務名去註冊中心獲取服務列表,當前客戶端底層會作隨機算法的選取得到服務並訪問。第三種須要一個@Bean的註解自動注入並直接調用restTemplate對象調用服務。底層調用模式與第二種調用方式同樣。以下:package com.yun.beans;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class Beans {
//管理簡單對象
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}@Bean註解告訴工廠,這個方法須要自動注入。@LoadBalanced,表示須要作負載勻衡。而後如controller中同樣注入一下restTemplate,而且使用他,區別是能夠直接使用服務名訪問了
String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
開始測試:1.運行server的啓動類:
2.運行servicesupport的啓動類:
3.運行serviceconsume的啓動類:
瀏覽器訪問:
8072爲服務消費方的端口訪問方法解析:
---------- 更新於星期日2018年12月30日 20:02 待續....---------待續...
點擊下圖配置接下來配置三臺01,02,03的虛擬機參數01:8699
02:8698
03:8697
以後點ok保存,可看見多出三個啓動項
接下來分別改註冊端口號,defaultZone分別啓動三個啓動項打開server的yml配置,刪掉前兩行端口號配置(圖中有錯,請把instance 和hostname那兩行刪掉)
配置好yml後點擊啓動
同理,咱們再次改動端口號爲8699和8697後,把啓動項改成02,以後啓動(圖中有錯,請把instance 和hostname那兩行刪掉)
同理把yml端口改成8699 和 8698後,把啓動項改成03,以後啓動(圖中有錯,請把instance 和hostname那兩行刪掉)
啓動後分別訪問三個01,02,03端口,已經能夠看見能夠訪問了。
打開服務提供方的yml配置以下,把端口號改成三個中其中的一個。
啓動服務提供方以後,再次訪問三個01,02,03咱們會發現重點:即便服務提供方只註冊了一個端口號8699,可是另外兩個端口號,也能感知到服務提供方8701的存在了。以下圖:
接下來像服務消費方中添加服務註冊者的端口號,這樣在server掛掉任何一個的時候,都能有其餘的server也能獲取服務列表
訪問如下服務消費方,發現能夠經過消費方調用server服務列表而且訪問service了
我麼隨便關閉其中兩個server的副本,重啓serviceconsume,再進行訪問。必須重啓serviceconsume才能清空緩存,清掉consume裏面有的服務列表。
上圖發現即便關閉兩臺server後依舊能夠訪問,以下圖,依舊從server中獲取了服務列表,從中也能看見以後不用再獲取服務列表了。
可是當咱們關掉全部server後。訪問仍是沒問題,由於緩存了服務列表。
可是讓咱們來重啓一下serviceconsume,再訪問就不行了。綜上咱們就完成了springcloud中server的高可用配置搭好了別忘點贊呀~
做者:Anakki