從零搭建 Spring Cloud 服務(wù)(超級詳細(xì))
點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號
重磅干貨,第一時間送達(dá)
作者:Anakki;鏈接:blog.csdn.net/qq_29519041/article/details/85238270
這里會介紹很多基礎(chǔ)知識,直接想開始搭建微服務(wù)的可以看第二章,微服務(wù)的搭建。直接看第二章不會有什么影響,可以先學(xué)會開車再學(xué)習(xí)車的構(gòu)造的,看個人習(xí)慣來。
1.什么是SpringCloud?
SpringCloud官網(wǎng):https://spring.io/projects/spring-cloud(個人建議是用谷歌瀏覽器訪問官網(wǎng)打開中文翻譯粗略把官網(wǎng)讀一遍)
個人理解:
以前的服務(wù)器就好像,一個會語數(shù)外全能的老師,為學(xué)生提供服務(wù),這個老師生病了,那全校停課。現(xiàn)在微服務(wù)流行后,學(xué)校有了數(shù)學(xué)教研組,語文教研組,外語教研組,每個教研組有一群老師具體負(fù)責(zé)某科的教學(xué),缺了誰,學(xué)校都照樣運(yùn)轉(zhuǎn)。
而這個變化中,那些改變歷史的程序員就是把一個服務(wù)器中的眾多服務(wù),或好幾臺服務(wù)器中的眾多服務(wù),分類出來,解耦合出來,把他們類似的功能交給同一個集群來做,把互相耦合在一起的功能剝離出來,按業(yè)務(wù),按功能來把他們作為一個個微服務(wù)放在服務(wù)器上,而這個服務(wù)器就只提供一個服務(wù),或較少的服務(wù)。
讓一個超大的服務(wù)邏輯,解耦合為一個個小服務(wù),均勻的分布在各自的服務(wù)器中。微服務(wù)就微在這。每個教研組就是一個微服務(wù)集群。他們提供同樣的服務(wù),而注冊中心Eureka就是這個存放這個教研組老師名單的地方,學(xué)生們想先訪問這個注冊中心獲取教師名單,然后根據(jù)相應(yīng)的負(fù)載方法去訪問各自老師。不至于讓集群中某一老師累死也不至于讓某一老師閑死。
而Zuul網(wǎng)關(guān)呢,就是學(xué)校的門衛(wèi),某些學(xué)生來學(xué)校找誰,它負(fù)責(zé)指引(路由),并且通過一些非常簡單的配置,達(dá)到阻攔一些人進(jìn)入(身份驗(yàn)證),或者控制想學(xué)數(shù)學(xué)的人只能去數(shù)學(xué)教研組,不能去核能教研組學(xué)怎么造原子彈(權(quán)限驗(yàn)證)。
那Hystrix熔斷器呢,可以把它當(dāng)成學(xué)校的志愿者,當(dāng)一個教研組集體罷課后,學(xué)生找不到老師了,這些志愿者及時的告訴來訪問的學(xué)生,相應(yīng)的結(jié)果,異常信息等,免得大量的學(xué)生在學(xué)校等待,這些志愿者趕快把這些等待的學(xué)生梳理出去,學(xué)生一直在學(xué)校等待,那其他需要學(xué)生的學(xué)校,也會等待學(xué)生,最后造成大面積的學(xué)校癱瘓。這里學(xué)生我們看成一個個請求。熔斷器就是把某事故的蔓延即使熔斷了。
當(dāng)然這些組件也是微服務(wù)需要注冊到Eureka注冊中心
那 Spring Cloud 就可以看成是這個學(xué)校了。眾多上面提到的組件相當(dāng)于都是這個學(xué)校的各職能部門。
ps: 博主基于Maven+idea搭建。 另外SpringCloud需要基于springboot搭建。
2.1 引入Spring Boot相關(guān)依賴 這里的springboot用的是1.5.7版本
引入Spring Cloud相關(guān)依賴 這里為 Edgware.SR5
2.1 工程初始化配置
在Idea中創(chuàng)建工程:File -> New ->Project

點(diǎn)擊 Empty Project -> Next

項(xiàng)目命名 -> 項(xiàng)目位置

選擇模組 modules ->next

進(jìn)入新的窗口后,開始配置Maven,打開設(shè)置 setting


因?yàn)槲抑白鲞^配置,因此只需要改變框1的路徑,如第一次配置需要自己找到你maven放置的位置,以及settings.xml,repository的位置,實(shí)在不會的百度 maven集成idea

3個框選擇完畢后點(diǎn)擊 ok
接下來新建module

這里可能會出現(xiàn)加載不出archetype list的問題

用了網(wǎng)上的所有解決辦法花了3個小時解決都沒用,重啟之后竟然可以了····你敢信?????小時候網(wǎng)吧網(wǎng)管的至理名言都忘了!!重啟一下嘛!!
出來之后 選擇quickstart ->下一步

名字自己想 想好后,復(fù)制一下你想好的 ArtifactId點(diǎn)擊Next,groupId為組織名 也是自己想一個,一般為公司網(wǎng)址反寫。

粘貼后下一步


提供注冊服務(wù)的服務(wù)器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父項(xiàng)目-->
<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>
![]()
2.2 Springboot的搭建 以及提供注冊服務(wù) 的 服務(wù)配置

![]()


![]()
server:
port: 8700 # 端口自己決定
# 指定當(dāng)前eureka客戶端的注冊地址,也就是eureka服務(wù)的提供方,當(dāng)前配置的服務(wù)的注冊服務(wù)方
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
register-with-eureka: false #自身 不在向eureka注冊
fetch-registry: false #啟動時禁用client的注冊
instance:
hostname: localhost
#指定應(yīng)用名稱
spring:
application:
name: eureka-server

package com.yun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //當(dāng)前使用eureka的server
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}


2.3 客戶端client 提供真正服務(wù)的角色的配置, 它提供服務(wù) 在 服務(wù)注冊方server (注冊中心)進(jìn)行注冊



![]()


server:
port: 8701 # 服務(wù)提供方
# 指定當(dāng)前eureka客戶端的注冊地址,
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:8700/eureka
instance:
hostname: localhost
#當(dāng)前服務(wù)名稱
spring:
application:
name: eureka-service
@RestController
@RequestMapping("/Hello")
public class Controller {
@RequestMapping("/World")
public String helloWorld(String s){
System.out.println("傳入的值為:"+s);
return "傳入的值為:"+s;
}
}@SpringBootApplication
@EnableDiscoveryClient//代表自己是一個服務(wù)提供方
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class,args);
}
}


2.4 服務(wù)的調(diào)用方式
第一種調(diào)用方式:restTemplate+ribbon


第二種調(diào)用方式:feign

2.4.1 restTemplate+ribbon
而客戶端負(fù)載均衡和服務(wù)端負(fù)載均衡最大的不同點(diǎn)在于上面所提到服務(wù)清單所存儲的位置。在客戶端負(fù)載均衡中,所有客戶端節(jié)點(diǎn)都維護(hù)著自己要訪問的服務(wù)端清單,而這些服務(wù)端端清單來自于服務(wù)注冊中心,比如上一章我們介紹的Eureka服務(wù)端。 同服務(wù)端負(fù)載均衡的架構(gòu)類似,在客戶端負(fù)載均衡中也需要心跳去維護(hù)服務(wù)端清單的健康性,默認(rèn)會創(chuàng)建針對各個服務(wù)治理框架的Ribbon自動化整合配置,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration。在實(shí)際使用的時候,我們可以通過查看這兩個類的實(shí)現(xiàn),以找到它們的配置詳情來幫助我們更好地使用它。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>server:
port: 8702 # 服務(wù)消費(fèi)方
# 指定當(dāng)前eureka客戶端的注冊地址,
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:8700/eureka
instance:
hostname: localhost
#當(dāng)前服務(wù)名稱
spring:
application:
name: eureka-consumer@SpringBootApplication
@EnableDiscoveryClient //當(dāng)前使用eureka的server
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class,args);
}
}
@RestController
@RequestMapping("/Hello")
class ConsumerController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/Consumer")
public String helloWorld(String s){
System.out.println("傳入的值為:"+s);
//第一種調(diào)用方式
//String forObject = new RestTemplate().getForObject("http://localhost:8071/Hello/World?s=" + s, String.class);
//第二種調(diào)用方式
//根據(jù)服務(wù)名 獲取服務(wù)列表 根據(jù)算法選取某個服務(wù) 并訪問某個服務(wù)的網(wǎng)絡(luò)位置。
//ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
//String forObject = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/Hello/World?s="+s,String.class);
//第三種調(diào)用方式 需要restTemplate注入的方式
String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
return forObject;
}
}@Autowired
private LoadBalancerClient loadBalancerClient;
@Configuration
public class Beans {
//管理簡單對象
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
![]()
![]()
![]()

訪問服務(wù)消費(fèi)方@RequestMapping指定的路徑及消費(fèi)方的端口來訪問消費(fèi)方的controller controller根據(jù)服務(wù)名去server方獲取獲取服務(wù)列表,獲取服務(wù)列表后根據(jù)隨機(jī)的模式負(fù)載勻衡后去選擇服務(wù)地址去訪問servicesupport:如下圖

2.5 Eureka server的高可用配置





















![]()

推薦閱讀
國產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(后續(xù))
年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了
關(guān)于程序員大白
程序員大白是一群哈工大,東北大學(xué),西湖大學(xué)和上海交通大學(xué)的碩士博士運(yùn)營維護(hù)的號,大家樂于分享高質(zhì)量文章,喜歡總結(jié)知識,歡迎關(guān)注[程序員大白],大家一起學(xué)習(xí)進(jìn)步!


