日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、微服務基礎

1.什么是SpringCloud?

SpringCloud官網:
https://spring.io/projects/spring-cloud(個人建議是用谷歌瀏覽器訪問官網打開中文翻譯粗略把官網讀一遍)

個人理解:

以前的服務器就好像,一個會語數外全能的老師,為學生提供服務,這個老師生病了,那全校停課?,F在微服務流行后,學校有了數學教研組,語文教研組,外語教研組,每個教研組有一群老師具體負責某科的教學,缺了誰,學校都照樣運轉。

而這個變化中,那些改變歷史的程序員就是把一個服務器中的眾多服務,或好幾臺服務器中的眾多服務,分類出來,結合出來,把他們類似的功能交給同一個集群來做,把互相耦合在一起的功能剝離出來,按業務,按功能來把他們作為一個個微服務放在服務器上,而這個服務器就只提供一個服務,或較少的服務。讓一個超大的服務邏輯,解耦合為一個個小服務,均勻地分布在各自的服務器中。微服務就微在這。

每個教研組就是一個微服務集群。他們提供同樣的服務,而注冊中心Eureka就是這個存放這個教研組老師名單的地方,學生們想先訪問這個注冊中心獲取教師名單,然后根據相應的負載方法去訪問各自老師。不至于讓集群中某一老師累死也不至于讓某一老師閑死。

而Zuul網關呢,就是學校的門衛,某些學生來學校找誰,它負責指引(路由),并且通過一些非常簡單的配置,達到阻攔一些人進入(身份驗證),或者控制想學數學的人只能去數學教研組,不能去核能教研組學怎么造原子彈(權限驗證)。

那Hystrix熔斷器呢,可以把它當成學校的志愿者,當一個教研組集體罷課后,學生找不到老師了,這些志愿者及時的告訴來訪問的學生,相應的結果,異常信息等,免得大量的學生在學校等待,這些志愿者趕快把這些等待的學生梳理出去,學生一直在學校等待,那其他需要學生的學校,也會等待學生,最后造成大面積的學校癱瘓。這里的學生我們看成一個個請求。熔斷器就是把某事故的蔓延即使熔斷了。

當然這些組件也是微服務需要注冊到Eureka注冊中心

那SpringCloud就可以看成是這個學校了。眾多上面提到的組件相當于都是這個學校的各職能部門。

二、微服務的搭建

ps: 博主基于Maven+idea搭建。

另外SpringCloud需要基于springboot搭建。

引入Spring Boot相關依賴:這里的springboot用的是1.5.7版本;引入Spring Cloud相關依賴:這里為 Edgware.SR5

2.1 工程初始化配置

在Idea中創建工程:File -> New ->Project

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

點擊 Empty Project -> Next

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

項目命名 -> 項目位置

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

選擇模組 modules ->next

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

進入新的窗口后,開始配置Maven,打開設置 setting

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 


從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

因為我之前做過配置,因此只需要改變框1的路徑,如第一次配置需要自己找到你maven放置的位置,以及settings.xml,repository的位置,實在不會的百度 maven集成idea

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

3個框選擇完畢后點擊 ok

接下來新建module

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

這里可能會出現加載不出archetype list的問題

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

用了網上的所有解決辦法花了3個小時解決都沒用,重啟之后竟然可以了····你敢信?????小時候網吧網管的至理名言都忘了??!重啟一下嘛?。?/p>

出來之后 選擇quickstart ->下一步

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

名字自己想 想好后,復制一下你想好的 ArtifactId點擊Next,groupId為組織名 也是自己想一個,一般為公司網址填寫。

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

粘貼后下一步

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 


從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

提供注冊服務的服務器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架構技術棧,這套架構絕了

 

等待右下角加載springcloud的依賴

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

2.2 Springboot的搭建 以及提供注冊服務 的 服務配置

創建resources文件夾

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

并設置作為資源目錄,之后文件變成這樣

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

之后文件夾變成有黃色的橫杠

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

在resources下新建文件,文件名為Application.yml (對是yml 不是xml ,博主第一次學習時,還以為是其他博主打錯了,踩了一個小坑)

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

配置yml,注意:如果只配置前兩行端口號信息會報錯

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

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

知識補充:

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

開發springboot的入口類
EurekaServerApplication.JAVA

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

EurekaServerApplication.java

package 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);
    }
}

右鍵運行當前類型:

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

運行成功console畫面

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

嘗試進入eureka管理界面 端口號為 yml里配置的(端口號自己設置 需要大于公用和保留的端口號)1024~65535

一般我喜歡設置為 8700到8800之間

如下 管理界面已經可以登錄了。

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

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

同樣新建module,選擇quickstart點擊下一步

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

兩個位置 置空

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

取名 下一步

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

注意這里要在根目錄springcloud 下創建模組,content root 會默認在之前的模組之下創建模組 這樣創建模組會出現問題并報錯

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

推薦這種配置方法 在content root下springcloud后改名字 如下圖配置點下一步,紅框處一般默認為上一個模組的文件目錄名,需要改為你的模組名

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

成功后為并列狀態,如不為并列或報錯請重新配置

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

配置servicesupport的pom,與server的pom配置相同,只需要把第一個pom的1的方框處server改為client

和第一個微服務同理 我們需要配置入口類 pom.xml application.yml,因為是服務提供者,這里還需編寫服務類controller

application.yml

server:
  port: 8701 # 服務提供方
 
# 指定當前eureka客戶端的注冊地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8700/eureka
  instance:
    hostname: localhost
 
#當前服務名稱
spring:
  application:
    name: eureka-service

pom.xml:

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

編寫所提供的 服務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服務 就是我們第一個編寫的微服務)

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

此時再進入服務注冊的頁面 http://localhost:8700/

可以看見服務提供者已被注冊進 服務注冊者

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

在直接訪問一下服務提供者的 網絡位置
http://localhost:8701/Hello/World?s=小沛

我們已經看見 可以訪問了,證明此微服務可用。

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

但是我們一般不直接調用所需的微服務,而是經過提供注冊服務的服務器server,獲取所需的服務提供者列表(為一個列表,此列表包含了能提供相應服務的服務器),他們也許是個集群,因此server會返回一個 ip+端口號的表,服務消費者通過相應算法訪問這表上的不同服務器,這些服務器提供的是相同的服務,這種在服務消費者一方挑選服務器為自己服務的方式是一種客戶端的負載均衡。

目前博主所知的有 輪詢和隨機兩種方式 訪問這些服務器,輪詢就是循環的意思,假如有3臺服務器,訪問方式就是1,2,3,1,2,3,1,2,3····,隨機就是隨機,回想一下random方法,一種無規律的方式。這兩種方式都是為了,訪問每個服務器的可能性盡量的相同。還有權重負載這種算法,意思就是 根據服務器負載能力的分配相應的服務。能力大的干得多。能力小的干得少。

2.4 服務的調用方式

第一種調用方式:restTemplate+ribbon

 

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 


從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

第二種調用方式:feign

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

2.4.1 restTemplate+ribbon

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);
    }
}
從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

如上圖:

我們需要一個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的啟動類:

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

2.運行servicesupport的啟動類:

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

3.運行serviceconsume的啟動類:

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

瀏覽器訪問:

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

8072為服務消費方的端口

訪問方法解析:

  • 訪問服務消費方@RequestMapping指定的路徑及消費方的端口來訪問消費方的controller
  • controller根據服務名去server方獲取獲取服務列表,獲取服務列表后根據隨機的模式負載勻衡后去選擇服務地址去訪問servicesupport:如下圖
從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

---------- 更新于星期日2018年12月30日 20:02 待續....---------

待續...

2.5 Eureka server的高可用配置

點擊下圖配置

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 


從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

接下來配置三臺01,02,03的虛擬機參數

01:8699

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

02:8698

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

03:8697

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

之后點ok保存,可看見多出三個啟動項

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

接下來分別改注冊端口號,defaultZone分別啟動三個啟動項

打開server的yml配置,刪掉前兩行端口號配置(圖中有錯,請把instance 和hostname那兩行刪掉)

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

配置好yml后點擊啟動

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

同理,我們再次改動端口號為8699和8697后,把啟動項改為02,之后啟動(圖中有錯,請把instance 和hostname那兩行刪掉)

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

同理把yml端口改為8699 和 8698后,把啟動項改為03,之后啟動(圖中有錯,請把instance 和hostname那兩行刪掉)

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

啟動后分別訪問三個01,02,03端口,已經可以看見可以訪問了。

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 


從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 


從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

打開服務提供方的yml配置如下,把端口號改為三個中其中的一個。

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

啟動服務提供方之后,再次訪問三個01,02,03我們會發現

重點:即使服務提供方只注冊了一個端口號8699,但是另外兩個端口號,也能感知到服務提供方8701的存在了。如下圖:

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 


從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 


從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

接下來像服務消費方中添加服務注冊者的端口號,這樣在server掛掉任何一個的時候,都能有其他的server也能獲取服務列表

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

訪問以下服務消費方,發現可以通過消費方調用server服務列表并且訪問service了

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

我么隨便關閉其中兩個server的副本,重啟serviceconsume,再進行訪問。必須重啟serviceconsume才能清空緩存,清掉consume里面有的服務列表。

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

上圖發現即使關閉兩臺server后依舊可以訪問,如下圖,依舊從server中獲取了服務列表,從中也能看見之后不用再獲取服務列表了。

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

但是當我們關掉所有server后。訪問還是沒問題,因為緩存了服務列表。

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

但是讓我們來重啟一下serviceconsume,再訪問就不行了。

從零開始搭建公司SpringCloud架構技術棧,這套架構絕了

 

綜上我們就完成了springcloud中server的高可用配置

作者:Anakki
鏈接:
https://blog.csdn.net/qq_29519041/article/details/85238270

分享到:
標簽:架構
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定