Spring Cloud集成了Ribbon,结合Eureka,可实现客户端的负载均衡。

下面实现一个例子,结构下图所示。

一、服务器端

1、创建项目

开发工具:IntelliJ IDEA 2019.2.3
IDEA中创建一个新的SpringBoot项目,名称为“cloud-server”,SpringBoot版本选择2.1.10,在选择Dependencies(依赖)的界面勾选Spring Cloud Discovery ->
Eureka Server,创建完成后的pom.xml配置文件自动添加SpringCloud最新稳定版本依赖,当前为Greenwich.SR3。
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.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>cloud-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-server</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
</properties> <dependencies>
<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> </project>

2、修改配置application.yml

server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false

3、修改启动类代码CloudServerApplication.java

增加注解@EnableEurekaServer

package com.example.cloudserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication
@EnableEurekaServer
public class CloudServerApplication { public static void main(String[] args) {
SpringApplication.run(CloudServerApplication.class, args);
} }

二、服务提供者

1、创建项目

IDEA中创建一个新的SpringBoot项目,除了名称为“cloud-provider”,其它步骤和上面创建服务器端一样。

2、修改配置application.yml

spring:
application:
name: cloud-provider
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/

3、修改启动类代码CloudProviderApplication.java

增加注解@EnableEurekaClient;
让类在启动时读取控制台输入,决定使用哪个端口启动服务器;
增加一个测试用的控制器方法。

package com.example.cloudprovider;

//import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest;
import java.util.Scanner; @SpringBootApplication
@EnableEurekaClient
@RestController
public class CloudProviderApplication { public static void main(String[] args) {
//SpringApplication.run(CloudProviderApplication.class, args);
Scanner scan = new Scanner(System.in);
String port = scan.nextLine();
new SpringApplicationBuilder(CloudProviderApplication.class).properties("server.port=" + port).run(args);
} @RequestMapping("/")
public String index(HttpServletRequest request) {
return request.getRequestURL().toString();
}
}

三、服务调用者

1、创建项目
IDEA中创建一个新的SpringBoot项目,除了名称为“cloud-invoker”,其它步骤和上面创建服务器端一样。

2、修改配置application.yml

server:
port: 9000
spring:
application:
name: cloud-invoker
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/

3、修改启动类代码CloudInvokerApplication.java

增加注解@EnableDiscoveryClient。

package com.example.cloudinvoker;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication
@EnableDiscoveryClient
public class CloudInvokerApplication { public static void main(String[] args) {
SpringApplication.run(CloudInvokerApplication.class, args);
} }

4、配置Ribbon有2种方式:使用代码、使用配置文件

方式一:使用代码
(1)新建一个自定义负载规则类MyRule.java
Ribbon的负载均衡器接口定义了服务器的操作,主要是用于进行服务器选择。
调用ILoadBalancer的getAllServers方法可以返回全部服务器,这里只返回第一个服务器。

package com.example.cloudinvoker;

import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server; import java.util.List; public class MyRule implements IRule { private ILoadBalancer iLoadBalancer; @Override
public Server choose(Object o) {
List<Server> servers = iLoadBalancer.getAllServers();
System.out.println("自定义服务器规则类,输出服务器信息:");
for(Server s: servers){
System.out.println(" " + s.getHostPort());
}
return servers.get(0);
} @Override
public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
this.iLoadBalancer = iLoadBalancer;
} @Override
public ILoadBalancer getLoadBalancer() {
return this.iLoadBalancer;
}
}

(2)新建一个Ping类MyPing.java

负载均衡器中提供了Ping机制,每隔一段时间去Ping服务器,判断服务器是否存活。
该工作由IPing接口的实现类负责。

package com.example.cloudinvoker;

import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.Server; public class MyPing implements IPing { @Override
public boolean isAlive(Server server) {
System.out.println("自定义Ping类,服务器信息:" + server.getHostPort() + ",状态:" + server.isAlive());
return true;
}
}

(3)新建配置类MyConfig.java

package com.example.cloudinvoker.config;

import com.example.cloudinvoker.MyPing;
import com.example.cloudinvoker.MyRule;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean; public class MyConfig {
@Bean
public IRule getRule(){
return new MyRule();
}
@Bean
public IPing getPing(){
return new MyPing();
}
}

(4)新建配置类CloudProviderConfig.java

package com.example.cloudinvoker.config;

import org.springframework.cloud.netflix.ribbon.RibbonClient;

@RibbonClient(name = "cloud-provider", configuration = MyConfig.class)
public class CloudProviderConfig {
}

方式二:使用配置文件

把方式一的两个配置类注释掉,在application.yml的最后面添加下面配置

cloud-provider:
ribbon:
NFLoadBalancerRuleClassName: com.example.cloudinvoker.MyRule
NFLoadBalancerPingClassName: com.example.cloudinvoker.MyPing
listOfServers: http://localhost:8080/,http://localhost:8081/

5、添加控制器 InvokerController.java

package com.example.cloudinvoker;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
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
@Configuration
public class InvokerController { @LoadBalanced
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
} @RequestMapping(value="/router", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
public String router(){
RestTemplate restTemplate = getRestTemplate();
//根据名称调用服务
String json = restTemplate.getForObject("http://cloud-provider/", String.class);
return json;
}
}

四、测试

1、启动服务器端。
2、启动两个服务提供者,在控制台中分别输入8080和8081启动。
3、启动服务调用者。
4、浏览器访问http://localhost:9000/router,多次刷新页面,结果都是:

http://localhost:8081/

服务调用者项目IDEA控制台定时输出:

自定义服务器规则类,输出服务器信息:
localhost:8081
localhost:8080
自定义Ping类,服务器信息:localhost:8081,状态:true
自定义Ping类,服务器信息:localhost:8080,状态:true

SpringCloud之Ribbon:负载均衡的更多相关文章

  1. spring-cloud配置ribbon负载均衡

    spring-cloud配置ribbon负载均衡 ribbon提供的负载均衡就是开箱即用的,简单的不能再简单了 为了顺利演示此demo,你需要如下 需要提前配置eureka服务端,具体看 https: ...

  2. SpringCloud系列——Ribbon 负载均衡

    前言 Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制.我们在上篇(猛戳:SpringCloud系列——Feign 服务调用)已经实现了多个服务之间的Feign调用 ...

  3. 浅谈SpringCloud (三) Ribbon负载均衡

    什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...

  4. SpringCloud:Ribbon负载均衡

    1.概述 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端       负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客 ...

  5. 四(2)、springcloud之Ribbon负载均衡

    2.Ribbon负载均衡 ​ Ribbon在工作时分成两步第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server. 第二步再根据用户指定的策略,在从server取到的 ...

  6. Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)

    什么是Ribbon,ribbon有什么用,个人先总结一下(不正确请提出讨论):Ribbon是基于客户端的负载均衡器,为我们提供了多样的负载均衡的方案,比如轮询,最小的并发请求的server,随机ser ...

  7. SpringCloud之Ribbon负载均衡及Feign消费者调用服务

    目的: 微服务调用Ribbon Ribbon负载均衡 Feign简介及应用 微服务调用Ribbon Ribbon简介 1. 负载均衡框架,支持可插拔式的负载均衡规则 2. 支持多种协议,如HTTP.U ...

  8. SpringCloud之Ribbon负载均衡配置

    一.负载均衡解决方案分类及特征 业界主流的负载均衡解决方案有: 1.1 集中式负载均衡 即在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责 ...

  9. Spring-Cloud之Ribbon负载均衡-3

    一.负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式.一种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix .另一种是将负载均衡逻辑以代码的形式封装到服 ...

  10. 第六章 SpringCloud之Ribbon负载均衡

    ###################使用默认的负载均衡(轮询)############################# 1.pom.xml <?xml version="1.0&q ...

随机推荐

  1. Springboot结合Redis

    安装 Redis   安装 gcc Yum install gcc-c++ 解压 redis.3.0.0.tar.gz 压缩包 tar -zxvf redis-3.0.0.tar.gz 进入解压后的目 ...

  2. vuex简单使用。

    项目结构: 1:首先在项目中新建store.js文件,.js文件内容如下: import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) ex ...

  3. CoderForces Round526 (A~E)题解

    A. The Fair Nut and Elevator time limit per test 1 second memory limit per test 256 megabytes input ...

  4. python 金融应用(三)数据可视化

    matplotlib 库( http://www.matp1otlìb.org )的基本可视化功能. 主要是2-D绘图.金融绘图和3-D绘图 一.2-D绘图 1.1一维数据集 #导入所需要的包impo ...

  5. DRF Django REST framework 之 频率,响应器与分页器组件(六)

    频率组件 频率组件类似于权限组件,它判断是否给予请求通过.频率指示临时状态,并用于控制客户端可以向API发出的请求的速率. 与权限一样,可以使用多个调节器.API可能会对未经身份验证的请求进行限制,而 ...

  6. 这些C++常用内置函数你会几个??

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Regina520  新手注意:如果你C++学的不好,可以去拿我的C+ ...

  7. ARTS-S cmake,googletest使用

    编译gtest 下载指定tag的源代码 git clone https://github.com/google/googletest.git cd googletest git checkout ta ...

  8. Asp.net Core dotnet 发布类库文件 带上注释,发布预发行版,带上所有引用

    带上注释 效果图 带上所有引用 效果图 预发行版 效果图 由于微软取消了  project.json  这个json 转而用了csproj 用于保存配置 所以懵逼很大一会 资料来源 project.j ...

  9. Java instanceof 和 Class.isInstance()区别与应用

    一.instanceof 关键字 instanceof 关键字用于判断某个实例是否是某个类的实例化对象,形如: String.class instanceof Class "test&quo ...

  10. Python3 网络编程基础1

    目录 开发架构 C/S架构 B/S架构 OSI模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 TCP协议 socket 开发架构 C/S架构 client 和 server, 既客户 ...