溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

發(fā)布時(shí)間:2021-04-17 17:03:38 來源:億速云 閱讀:470 作者:Leah 欄目:編程語言

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

1,什么是Eureka,什么是服務(wù)注冊(cè)與發(fā)現(xiàn)

Spring Boot作為目前最火爆的web框架。那么它與Eureka又有什么關(guān)聯(lián)呢?

  1. Eureka是Netflix開源的一個(gè)RESTful服務(wù),主要用于服務(wù)的注冊(cè)發(fā)現(xiàn)。

  2. Eureka由兩個(gè)組件組成:Eureka服務(wù)器和Eureka客戶端。Eureka服務(wù)器用作服務(wù)注冊(cè)服務(wù)器。

  3. Eureka客戶端是一個(gè)java客戶端,用來簡(jiǎn)化與服務(wù)器的交互、作為輪詢負(fù)載均衡器,并提供服務(wù)的故障切換支持。

  4. Netflix在其生產(chǎn)環(huán)境中使用的是另外的客戶端,它提供基于流量、資源利用率以及出錯(cuò)狀態(tài)的加權(quán)負(fù)載均衡。

2,先創(chuàng)建一個(gè)Eureka-Server服務(wù)注冊(cè)中心

這里需要用到spring-cloud的Eureka模塊,他是一個(gè)服務(wù)的注冊(cè)和發(fā)現(xiàn)模塊

如圖我們先new一個(gè)Spring-boot工程引入Eureka Server

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

Next>>>>Finish完成

我們來看看構(gòu)建好的Eureka-Server的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.eureka</groupId>
  <artifactId>server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>server</name>
  <description>Demo project for Spring Boot</description>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.RC2</spring-cloud.version>
  </properties>
  <dependencies>
    <!-- 引入的Eureka-server -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
  </dependencies>
  <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>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
</project>

我們看到這里與普通的Spring-boot項(xiàng)目不同的是,這里引用了一個(gè)Eureka-Server包。

那么我們?cè)趺词褂盟?,怎么啟?dòng)它呢?

這里只需要啟動(dòng)一個(gè)注解就可以啦,我們?cè)赟pring-Boot工程的啟動(dòng)類上加>>>>>> @EnableEurekaServer

代碼如下:

package com.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
 * 啟動(dòng)一個(gè)服務(wù)注冊(cè)中心
 */
@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(ServerApplication.class, args);
  }
}

差點(diǎn)忘了,我們還需要配置application.yml

Eureka是一個(gè)高可用的組件,每一個(gè)實(shí)例注冊(cè)之后需要向注冊(cè)中心發(fā)送心跳包,在默認(rèn)情況下erureka server也是一個(gè)eureka client ,必須要指定一個(gè) server。

eureka server的配置文件appication.yml:

server:
 port: 8081 #服務(wù)注冊(cè)中心端口號(hào)
eureka:
 instance:
  hostname: 127.0.0.1 #服務(wù)注冊(cè)中心IP地址
 client:
  registerWithEureka: false #是否向服務(wù)注冊(cè)中心注冊(cè)自己
  fetchRegistry: false #是否檢索服務(wù)
  serviceUrl: #服務(wù)注冊(cè)中心的配置內(nèi)容,指定服務(wù)注冊(cè)中心的位置
   defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

我們來啟動(dòng)一下吧

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

我們?cè)跒g覽器上輸入http://127.0.0.1:8081/飛機(jī)直達(dá)

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

我們可以看到它的可視化界面

細(xì)心的朋友會(huì)發(fā)現(xiàn),這里沒有發(fā)現(xiàn)服務(wù)???No instance available

why? 因?yàn)槲覀冞€沒有服務(wù)向注冊(cè)中心注冊(cè)服務(wù),所以找不到啊

3,先創(chuàng)建一個(gè)Eureka-Client客戶端也就是服務(wù)提供者

客戶端在向注冊(cè)中心它會(huì)提供一些元數(shù)據(jù),例如主機(jī)和端口,URL,主頁(yè)等。Eureka server 從 每 個(gè)client實(shí)例接收心跳消息。 如果心跳超時(shí),則通常將該實(shí)例從注冊(cè)server中刪除。

創(chuàng)建客戶端和服務(wù)端差不多,只是啟動(dòng)注解有點(diǎn)不一樣,還有yml配置文件

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

Next>>>Finish完成啦

打開會(huì)發(fā)現(xiàn)pom.xml其實(shí)和Server注冊(cè)中心的類似

<?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.eureka</groupId>
  <artifactId>provider</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>provider</name>
  <description>Demo project for Spring Boot</description>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.RC2</spring-cloud.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <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>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
</project>

怎么證明它是Client呢

很簡(jiǎn)單

在Spring-boot的啟動(dòng)類上通過注解@EnableEurekaClient 表明自己是一個(gè)eurekaclient.

package com.eureka.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
 * Eureka客戶端
 */
@RestController
@EnableEurekaClient
@SpringBootApplication
public class ProviderApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(ProviderApplication.class, args);
  }
 
 
  /**
   * 假如這個(gè)客戶端要提供一個(gè)getUser的方法
   * @return
   */
  @GetMapping(value = "/getUser")
  @ResponseBody
  public Map<String,Object> getUser(@RequestParam Integer id){
    Map<String,Object> data = new HashMap<>();
    data.put("id",id);
    data.put("userName","admin");
    data.put("from","provider-A");
    return data;
  }
 
}

雖然加好了@EnableEurekaClient,總感覺差點(diǎn)什么,對(duì)了,配置文件yml

eureka:
 client:
  serviceUrl: #注冊(cè)中心的注冊(cè)地址
   defaultZone: http://127.0.0.1:8081/eureka/
server:
 port: 8082 #服務(wù)端口號(hào)
spring:
 application:
  name: service-provider #服務(wù)名稱--調(diào)用的時(shí)候根據(jù)名稱來調(diào)用該服務(wù)的方法

我們來啟動(dòng)看看吧

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

我們看到這個(gè)客戶端已經(jīng)向注冊(cè)中心注冊(cè)服務(wù)了,那么我們打開Eureka-server飛機(jī)直達(dá)

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

我們看到我們啟動(dòng)的服務(wù)是不是加進(jìn)去了呢

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

我們看到我們的服務(wù)是不是加進(jìn)去了呢。

那么有人會(huì)問,那一大堆飆紅的什么意思啊。因?yàn)樽?cè)的服務(wù)都是高可用的,這里只檢測(cè)到一個(gè)服務(wù),產(chǎn)生的預(yù)警,不影響使用,等下我們啟動(dòng)多個(gè)實(shí)例就不會(huì)了。

我們先來測(cè)試下客戶端的方法是否可用 http://127.0.0.1:8082/getUser?id=1

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

顯然是沒有問題,那么我們提供好了服務(wù),sei來消費(fèi)呢?

下面我們就來建立一個(gè)消費(fèi)者

為了更簡(jiǎn)單易懂,我還是一步一步出圖吧。

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

來,貼上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.eureka</groupId>
  <artifactId>consumer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>consumer</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.RC2</spring-cloud.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <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>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

  <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>


</project>

主要是啟動(dòng)類,里面內(nèi)容就豐富啦,都在注釋里

package com.eureka.consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * Eureka客戶端-消費(fèi)者
 */
@RestController
@EnableEurekaClient
@SpringBootApplication
public class ConsumerApplication {

  @Autowired
  RestTemplate restTemplate;

  public static void main(String[] args) {
    SpringApplication.run(ConsumerApplication.class, args);
  }

  /**
   * 實(shí)例化RestTemplate
   * @return
   */
  @LoadBalanced
  @Bean
  public RestTemplate rest() {
    return new RestTemplate();
  }

  /**
   * Rest服務(wù)端使用RestTemplate發(fā)起http請(qǐng)求,然后得到數(shù)據(jù)返回給前端----gotoUser是為了區(qū)分getUser怕小伙伴暈頭
   * @param id
   * @return
   */
  @GetMapping(value = "/gotoUser")
  @ResponseBody
  public Map<String,Object> getUser(@RequestParam Integer id){
    Map<String,Object> data = new HashMap<>();
    /**
     * 小伙伴發(fā)現(xiàn)沒有,地址居然是http://service-provider
     * 居然不是http://127.0.0.1:8082/
     * 因?yàn)樗蜃?cè)中心注冊(cè)了服務(wù),服務(wù)名稱service-provider,我們?cè)L問service-provider即可
     */
    data = restTemplate.getForObject("http://service-provider/getUser?id="+id,Map.class);
    return data;
  }
}

配置文件和

eureka:
 client:
  serviceUrl: #注冊(cè)中心的注冊(cè)地址
   defaultZone: http://127.0.0.1:8081/eureka/
server:
 port: 8083 #服務(wù)端口號(hào)
spring:
 application:
  name: service-consumer #服務(wù)名稱--調(diào)用的時(shí)候根據(jù)名稱來調(diào)用該服務(wù)的方法

我們啟動(dòng)看看效果吧

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

看看我們的提供者和消費(fèi)者是不是都進(jìn)來了

那么我們看看我們消費(fèi)者的方法是否可用 飛機(jī)直達(dá)

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

哈哈,是不是很神奇

下面介紹個(gè)更神奇的東西--實(shí)現(xiàn)微服務(wù)負(fù)載均衡

我們把服務(wù)提供者復(fù)制一個(gè)工程出來,我們?cè)僮鱿滦⌒〉男薷?,看看是否能?shí)現(xiàn)負(fù)載均衡。

我們需要修改兩個(gè)文件

一個(gè)是啟動(dòng)類,改了哪些呢?看看就曉得咯

package com.eureka.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * Eureka客戶端
 */
@RestController
@EnableEurekaClient
@SpringBootApplication
public class ProviderApplication {

  public static void main(String[] args) {
    SpringApplication.run(ProviderApplication.class, args);
  }


  /**
   * 假如這個(gè)客戶端要提供一個(gè)getUser的方法
   * @return
   */
  @GetMapping(value = "/getUser")
  @ResponseBody
  public Map<String,Object> getUser(@RequestParam Integer id){
    Map<String,Object> data = new HashMap<>();
    data.put("id",id);
    data.put("userName","admin");
    data.put("from","provider-B");//改這里是為了讓大家更能理解它負(fù)載均衡的機(jī)制
    return data;
  }

}

還有就是yml配置文件

eureka:
 client:
  serviceUrl: #注冊(cè)中心的注冊(cè)地址
   defaultZone: http://127.0.0.1:8081/eureka/
server:
 port: 8088 #服務(wù)端口號(hào)--該端口不要沖突
spring:
 application:
  name: service-provider #服務(wù)名稱--調(diào)用的時(shí)候根據(jù)名稱來調(diào)用該服務(wù)的方法--名字絕對(duì)不能改,改了就訪問不到了

我們來啟動(dòng)一下吧

看看Eureka-server后臺(tái)的效果 ServerA ServerB

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

這個(gè)叫做Service-provider是不是有兩個(gè)實(shí)例啊

那么,我們分別訪問一下,看看效果怎么樣

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

看到了嗎,8082端口,from是provider-A,8088端口,from是provider-B.

那么我們?cè)L問消費(fèi)者的服務(wù)器看看會(huì)出現(xiàn)什么樣的情況呢 飛機(jī)直達(dá)

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

一開始是from A,你刷新一下,誒? 變成 from B了。

說明這個(gè)時(shí)候兩臺(tái)提供者在交替工作,從而達(dá)到了一個(gè)負(fù)載均衡的作用。

來來來,我給你畫個(gè)圖

怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡

關(guān)于怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI