上个章节我们已经启动了服务生产者实例,这一章我们会启动四个不同端口的实例,然后如何通过负载平衡访问呢?这时就需要Ribbon,为了使用Ribbon,我们需要使用@LoadBalanced元注解,那么这个注解放在哪里呢?一般有两个DiscoveryClient 和 RestTemplate
然后选择spring web 、spring cloud discovery和spring cloud routing支持
下一步,生成目录
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接口
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为服务实例中提供的接口名,上章文章中服务实例没有这个接口,我们去添加一下
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.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/
选择填写三处内容
新增EurekaclientApplication1\EurekaclientApplication2两个后最终为
此时可以分别启动EurekaServerApplication(服务注册中心)、EurekaclientApplication(实例1)、EurekaclientApplication1(实例2)、EurekaclientApplication2(实例3)、RibbonConsumerApplication(Ribbon请求入口)
再次访问http://localhost:3456/服务注册中心,就会发现三个client实例,一个EUREKA-CONSUMER
然后访问http://localhost:8083/ribbon-consumer
这是ribbon会根据注册的三个实例轮询请求
本文是通过RestTemplate进行访问,我们还可以通过DiscoveryClient 进行访问
1、获取实例集合,我们可以轮询或者根据自己要求去灵活访问
List<ServiceInstance> instances=discoveryClient.getInstances("eureka-client");
ServiceInstance serviceInstance=instances.get(0);