欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

程序员文章站 2022-05-04 08:56:23
上个章节我们已经启动了服务生产者实例,这一章我们会启动四个不同端口的实例,然后如何通过负载平衡访问呢?这时就需要Ribbon,为了使用Ribbon,我们需要使用@LoadBalanced元注解,那么这个注解放在哪里呢?一般有两个DiscoveryClient 和 RestTemplate然后选择spring web 、spring cloud discovery和spring cloud routing支持下一步,生成目录pom.xml文件内容自动生成

 上个章节我们已经启动了服务生产者实例,这一章我们会启动四个不同端口的实例,然后如何通过负载平衡访问呢?这时就需要Ribbon,为了使用Ribbon,我们需要使用@LoadBalanced元注解,那么这个注解放在哪里呢?一般有两个DiscoveryClient 和 RestTemplate

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

然后选择spring web 、spring cloud discovery和spring cloud routing支持

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

下一步,生成目录

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springcloud</groupId>
    <artifactId>ribbon-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ribbon-consumer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR6</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-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </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>

</project>

修改整合ribbon 启动类RibbonConsumerApplication 加入注解

@EnableDiscoveryClient 注册到eureka注册中心
@Bean  加入ioc容器
@LoadBalanced  让restemplate具有负载均衡能力
package com.springcloud.ribbonconsumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableDiscoveryClient
@SpringBootApplication
public class RibbonConsumerApplication {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate () {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerApplication.class, args);
    }

}

配置eureka参数

spring.application.name=eureka-consumer
server.port=8083
## 心跳时间,即服务续约间隔时间(缺省为30s)
#eureka.instance.lease-renewal-interval-in-seconds= 5
## 发呆时间,即服务续约到期时间(缺省为90s)
#eureka.instance.lease-expiration-duration-in-seconds= 15
## 开启健康检查(依赖spring-boot-starter-actuator)
#eureka.client.healthcheck.enabled=true
eureka.client.serviceUrl.defaultZone=http://localhost:3456/eureka/

新增controller文件夹,加入ConsumerController接口

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

package com.springcloud.ribbonconsumer.Controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value ="/ribbon-consumer", method = RequestMethod.GET)
    public String helloConsumer() {
       return restTemplate.getForEntity("http://eureka-client/hello", 
                String.class).getBody();
    }
 
}

其中http://eureka-client/hello",中的eureka-client为注册在eureka注册中心的实例名称

hello为服务实例中提供的接口名,上章文章中服务实例没有这个接口,我们去添加一下

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

package com.springcloud.eurekaclient.Controller;

import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.logging.Logger;

@RestController
public class HelloController {
    @Value("${server.port}")
    String port;


    @RequestMapping(value = "hello", method = RequestMethod.GET)
    public String index() {
        StringBuffer uriList = new StringBuffer("Hello World " + port + " 端口为您服务!<br>");
        return uriList.toString();
    }
}

然后新增两个资源文件--为了同一个moudle可以启动多次(根据不同的端口启动)

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

spring.application.name=eureka-client
server.port=8081
# 心跳时间,即服务续约间隔时间(缺省为30s)
eureka.instance.lease-renewal-interval-in-seconds= 5
# 发呆时间,即服务续约到期时间(缺省为90s)
eureka.instance.lease-expiration-duration-in-seconds= 15
# 开启健康检查(依赖spring-boot-starter-actuator)
eureka.client.healthcheck.enabled=true
eureka.client.serviceUrl.defaultZone=http://localhost:3456/eureka/

spring.application.name=eureka-client
server.port=8082
# 心跳时间,即服务续约间隔时间(缺省为30s)
eureka.instance.lease-renewal-interval-in-seconds= 5
# 发呆时间,即服务续约到期时间(缺省为90s)
eureka.instance.lease-expiration-duration-in-seconds= 15
# 开启健康检查(依赖spring-boot-starter-actuator)
eureka.client.healthcheck.enabled=true
eureka.client.serviceUrl.defaultZone=http://localhost:3456/eureka/

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

选择填写三处内容

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

新增EurekaclientApplication1\EurekaclientApplication2两个后最终为

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

此时可以分别启动EurekaServerApplication(服务注册中心)、EurekaclientApplication(实例1)、EurekaclientApplication1(实例2)、EurekaclientApplication2(实例3)、RibbonConsumerApplication(Ribbon请求入口)

再次访问http://localhost:3456/服务注册中心,就会发现三个client实例,一个EUREKA-CONSUMER

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

然后访问http://localhost:8083/ribbon-consumer

这是ribbon会根据注册的三个实例轮询请求

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

spring cloud系列学习(SpringCloud之服务注册之Ribbon负载均衡)

本文是通过RestTemplate进行访问,我们还可以通过DiscoveryClient 进行访问

1、获取实例集合,我们可以轮询或者根据自己要求去灵活访问

List<ServiceInstance> instances=discoveryClient.getInstances("eureka-client");
ServiceInstance serviceInstance=instances.get(0);

本文地址:https://blog.csdn.net/fsdad/article/details/107493295