SpringCloud與Consul集成實現負載均衡


一、背景

SpringCloud微服務目前比較流行,其中大都在使用的服務注冊與發現是Eureka,最近研究了Consul的集群搭建,現使用Consul實現服務的負載均衡。其主要拓撲結構如下:

二、Consul集群環境搭建

本次搭建采用了三台虛擬機,Linux系統,從Consul官網下載安裝包,解壓即可使用。在每台機器下建一個目錄/data/consul/data,這個目錄主要存放器群啟動后生成的一些數據。需要開啟的端口,8300, 8301, 8500, 8600。

分別在以下三個機器上執行一下啟動命令。

機器1:10.0.0.45

./consul agent -server -bootstrap-expect 2 -data-dir=/data/consul/data -node=consul-server-1 -bind=10.0.0.45 -client=0.0.0.0 &

機器2:10.0.0.100

./consul agent -server -bootstrap-expect 2 -data-dir=/data/consul/data -node=consul-server-2 -bind=10.0.0.100 -client=0.0.0.0 &

機器3:10.0.0.191

./consul agent -server -bootstrap-expect 2 -data-dir=/data/consul/data -node=consul-server-3 -bind=10.0.0.191 -client=0.0.0.0 -ui &

參數說明:

  •  server: 以server身份啟動。默認是client
  •  bootstrap-expect:集群要求的最少server數量,當低於這個數量,集群即失效。
  •  data-dir:data存放的目錄,更多信息請參閱consul數據同步機制
  •  node:節點id,在同一集群不能重復。
  •  bind:監聽的ip地址。默認綁定0.0.0.0,可以不指定
  •  client: 客戶端的ip地址,0.0.0.0是指誰都可以訪問
  •  ui: 可以訪問UI界面

三台機器上的服務啟動完成后,將兩台機器添加到其中一台機器上,組建成集群。

分別在機器2和機器3上執行:./consul join 10.0.0.45,構成集群,同樣也可以再增加別的節點。

啟動成功后訪問任意一台機器  http://10.0.0.45:8500,會看到如下界面,有3個健康的節點:

 

三、SpringCloud服務注冊

注冊中心已經搭建完畢,接下來就是准備兩個服務,一個是生產者consul-producer,一個是消費者consul-consumer。

3.1 生產者代碼,代碼很簡單,就是RestAPI請求並返回一個字符串

 

@RestController
public class ProducerController {

    @GetMapping("/producer")
    public String producer(){
        System.out.println("I'm producer");
        return "Hello, I'm producer";
    }
}

以下是生產者consul-producer的啟動配置文件application.yml:

spring:
  application:
    name: consul-producer  #程序名稱
  cloud:
    consul:
      host: 10.0.0.100 #consul節點IP
      port: 8500       #consul節點端口
      discovery:
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} #實例ID
        health-check-path: /actuator/health                                                      #健康檢查
        health-check-interval: 10s

server:
  port: 9091  #消費者服務端口

 

3.2 消費者代碼,代碼也很簡單,使用大家熟悉分Feign,Controller接受請求,用過service調用消費者提供的服務

/**
 * 消費者
 */
@RestController
public class ConsumerController {

    @Autowired
    private ConsumerService consumerService;

    @GetMapping("/consumer")
    public String getProducer(){

        return consumerService.consumer();
    }
}

以下是feign調用的接口聲明:

/**
 * 調用生產者服務
 */
@FeignClient("consul-producer")
public interface ProducerRemote {

    @GetMapping("/producer")
    String producer();
}

以下是生產者consul-consumer的啟動配置文件application.yml:

spring:
  application:
    name: consul-consumer  #消費者名稱
  cloud:
    consul:
      host: 10.0.0.45    #consul注冊節點IP
      port: 8500         #consul注冊節點端口
      discovery:
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}  #實例ID
        health-check-path: /actuator/health                                                       #健康檢查
        health-check-interval: 10s
server:
  port: 9092   #消費者服務端口

兩部分的源碼可在Github上查看https://github.com/liuzwei/consul-demo.git

生產者和消費者存在了,就啟動可以了,接下來是啟動兩個生產者,一個消費者,為了直觀的區分兩個生產者,在調用生產者返回的string稍微做了區分,一個是返回“Hello, I'm producer”,而另一個則返回“Hello, I'm producer2”,為了實現負載均衡便於測試。

其中在本機上10.0.0.93分別啟動了程序consul-consumer和consul-producer,在另一台機器10.0.0.191上啟動另一個生產者實例consul-producer

啟動之后在consul的界面上看到如下樣子:

四、測試負載功能

通過瀏覽器,Get請求消費者的controller,會看到“Hello, I'm producer”和“Hello, I'm producer2”在交替顯示,這也是fegin調用的特性,輪詢機制實現負載均衡。

 

五、總結

目前微服務框架比較流行,最近項目也是上線了一些Spring Cloud微服務架構的產品,同時也在探索其他可替代組件,因此對consul進行了相關學習,便整理成該文章,在consul的使用過程中也是存在一些不明白的地方,其中Eureka的注冊時可以配置多地址的,沒有發現consul怎么向多個節點進行注冊,希望有用過的大佬給指點一二,還在學習中,共勉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM