上一节我们已经学习了Eureka 注册中心,其实我们也使用到了Ribbon ,只是当时我们没有细讲,所以我们现在一起来学习一下Ribbon。
什么是Ribbon之前接触到的负载均衡都是硬负载均衡,什么是硬负载均衡呢?硬负载均衡就是在以往的大型系统中,会有单独一套系统来负责负载均衡策略,我们所以的请求都会先走到负载均衡的系统上,进行分配到不同的服务器处理。
比如我们熟悉的nginx 。其实就可以算作一个负载均衡的系统,客户端请求的接口会先通过nginx 的负载均衡策略分配到不同的服务器上。
那Ribbon 不是这样的吗?那又是怎样的呢?
Ribbon 是和 Eureka 一样是Netflix 推出的开源产品,它可以和Eureka 完成无缝结合,Ribbon 主要实现客户端负载均衡。
那什么是客户端负载均衡呢?
就是在客户端请求的时候,就通过均衡策略将请求分发到不同的服务器上,如下图
这个图是根据上节的Eureka 的架构图改编来的,主要的流程还是没有变,服务消费者和服务提供者都会注册到服务中心,然后服务消费者会从服务中心获取可用实例列表 ,这里就会通过负载均衡策略选择其中一个实例进行访问。
好了我们来用代码来看一下。
demo我们为了简化,注册中心服务端,我们还是用上节的单节点。怎么配置我不说了。然后我们新建一个module 用来做服务提供者,其实也可以用上一节的服务提供者,但是我怕揉在一起不好,所以就全都分开了,不过很多代码都是一样的。
服务提供者我们新建一个模块后pom.xml 文件如下:
<parent> <groupId>cn.quellanan</groupId> <artifactId>SpringCloud</artifactId> <version>1.0.0</version> </parent> <groupId>com.quellanan.springcloud</groupId> <artifactId>ribbon-provider-9004</artifactId> <version>1.0.0</version> <name>ribbon-provider-9004</name> <description>ribbon-provider-9004 服务提供者</description> <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> </dependencies>主要就是引入了eureka-client 可以注册到注册中心去,然后启动类加上@EnableEurekaClient 注解
在配置文件中加上配置如下: server.port=9004 spring.application.name=ribbon-provider eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
我们在创建一个测试类:HelloController
@RestController @Slf4j public class HelloController { @Value("${server.port}") private String port; @RequestMapping("/hello") public String hello(){ log.info(port); return "hello "+port; } }这样我们一个服务提供者就弄好了,为了看出负载均衡的效果,我们还需要创建一个一样的服务提供者。或者不同的端口启动。我们将端口改为9005.其他的和上面一样。
服务消费者服务提供者有了,我们再来创建一个服务消费者的模块。pom.xml 较服务提供者就多了一个ribbon 的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>然后启动类中加上@EnableEurekaClient 和 RestTemplate
@SpringBootApplication @EnableEurekaClient public class RibbonConsumerApplication { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonConsumerApplication.class, args); } }@LoadBalanced 注解就是来实现客户端负载均衡的。
配置文件中加入如下配置:
server.port=9003 #服务名,在注册时所用 spring.application.name=ribbon-consumer eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/最后我们来写一个调用服务提供者的接口,创建一个IndexController类,内容如下
@RestController public class IndexController { private static final String applicationName = "ribbon-provider"; @Autowired private RestTemplate restTemplate; @RequestMapping("/index") public String getHello(){ String url = "http://"+ applicationName +"/hello"; return restTemplate.getForObject(url,String.class); } } 测试我们现在来启动服务中心,两个服务提供者,一个服务消费者。启动之后我们输入:
:8000/