Spring Cloud 负载均衡初体验
本文首发于我的个人博客,Spring Cloud 负载均衡初体验 ,欢迎访问!
使用 Spring Cloud Netflix 组件 Eureka 和 Ribbon 构建单注册中心的负载均衡服务。
Spring Cloud 是基于 Spring 的微服务技术栈,可以这么概括吧,里面包含了很多例如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等组件,可以通过 Spring Boot 的形式进行集成和使用。
目前,项目中有这么个需求,Spring Boot 做一个 web 服务,然后调用 TensorFlow 模型得到结果。但是由于 TensorFlow GPU 版,不支持多线程多引擎,所以只能采用多进程的方式去进行调度,所以需要做一个负载均衡。负载均衡的话,可以分为客户端和服务端负载均衡。我目前还没能领悟到有什么不同,毕竟整体的架构都是一样的,如下如图。其中客户端均衡负载的代表是 Spring Cloud 的 Ribbon,服务端负载均衡代表是 Nginx。
由于项目的压力并不大,日平均请求约 5000 左右,因此就采用 Spring Cloud 中的组件进行客户端负载均衡。主要用到的就是 Spring Cloud 和 Eureka。很多博客中会也看到 Ribbon 的身影。其实他们都是 Spring Cloud Netflix 中的组件,用来构建微服务。本文所讲的例子,也可以看作是一个微服务,把原来一个的算法服务拆成了若干个小服务。之前讲到的 Spring Cloud 的各种组件也都是为了使得这些独立的服务能够更好的管理和协作。
回到负载均衡,一个使用 Spring Boot 搭建的客户端负载均衡服务,其实只需要 Rureka 这一个组件就够了。
Eureka 是 Spring Cloud Netflix 当中的一个重要的组件,用于服务的注册和发现。Eureka 采用了 C-S 的设计架构。具体如下图,Eureka Server 作为一个注册中心,担任服务中台的角色,余下的其他服务都是 Eureka 的 Client。所有的服务都需要注册到 Eureka Server 当中去,由它进行统一管理和发现。Eureka Server 作为管理中心,自然,除了注册和发现服务外,还有监控等其他辅助管理的功能。
具体从负载均衡的角度来讲:
- Eureka Server——提供服务注册和发现
- Service Provider——服务提供方,一般有多个服务参与调度
- Service Consumer——服务消费方,从 Eureka 获取注册服务列表,从而能够消费服务,也就是请求的直接入口。
服务搭建
下面主要实战一下负载均衡服务搭建。
正如上面所说,一套完整的负载均衡服务,至少需要三个服务。
1.注册中心——Eureka Server
直接通过 IDEA 创建一个包含 Eureka Server 的 Spring Boot 项目,直接引入所需的 dependency。主要是 spring-cloud-dependencies
和 spring-cloud-starter-netflix-eureka-server
。
<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>
在启动类上添加注解 @EnableEurekaServer
。
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
在 yml 中配置 eureka。
server:
port: 8080
eureka:.
instance:
prefer-ip-address: true
client:
# 表示是否将自己注册到 Eureka Server,默认为 true
register-with-eureka: false
# 表示是否从 Eureka Server 获取注册信息,默认为 true
fetch-registry: false
service-url:
# 默认注册的域,其他服务都往这个 url 上注册
defaultZone: http://localhost:${server.port}/eureka/
由于目前配置的是单节点的注册中心,因此 register-with-eureka
和 fetch-registry
都设为 false,不需要把自己注册到服务中心,不需要获取注册信息。
启动工程后,访问:http://localhost:8080/,就能看到一个图形化的管理界面,目前没有注册任何服务。
2.服务提供方——Service Provider
在 yml 中配置 Eureka。
eureka:
instance:
prefer-ip-address: true # 以 IP 的形式注册
# 默认是 hostname 开头的,修改成 ip 开头
instance-id: \${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:
serviceUrl:
defaultZone: http://localhost:8080/eureka/ # 注册到之前的服务中心
server:
port: 8084
spring:
application:
name: services-provider # 应用名称
默认,Eureka 是通过 hostname 来注册到 Eureka Server 上的,由于后面可能涉及到多节点的配置,hostname 可能不如 ip 方便管理,所以将 prefer-ip-address 设为 true,通过 ip 注册,并修改 instance-id 格式为:${spring.cloud.client.ip-address}
Spring Cloud 负载均衡初体验的更多相关文章
- Spring Cloud负载均衡:使用zuul作服务器端负载均衡
1.目的: 本文简述Spring Cloud负载均衡之服务器负载均衡模式,使用组件为zuul. zuul作为Spring Cloud中的网关组件,负责路由转发.身份验证.请求过滤等等功能,那么我们可以 ...
- spring Cloud负载均衡Ribbon
Ribbon饥饿加载 默认情况下Ribbon是懒加载的.当服务起动好之后,第一次请求是非常慢的,第二次之后就快很多. 解决方式:开启饥饿加载 ribbon: eager-load: enabled: ...
- Spring Cloud负载均衡:使用Feign作客户端负载均衡
有了一篇服务端负载均衡后,再来一篇客户端负载均衡,客户端负载均衡很简单,无需在zuul中做多余配置(本示例不引入zuul),只需要在客户端进行Feign引入和配置即可. 准备工作很简单,实现客户端负载 ...
- Spring Cloud Data Flow初体验,以Local模式运行
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring Cloud Data Flow是什么,虽然已经出现一段时间了,但想必很多人不知道,因为在项目中很少有人用.不仅 ...
- nginx负载均衡初体验
本例采取简单的轮询策略进行nginx的负载均衡处理. 在反向代理(参考:https://www.cnblogs.com/ilovebath/p/14771571.html)的基础上增加负载均衡处理的n ...
- 玩转spring boot——负载均衡与session共享
前言 当项目上线后,如果要修复bug或扩充功能,都需要重启tomcat服务.此时,正在使用应用的用户们就需要等待服务器的重启,而这就会造成不好的用户体验.还有,当仅仅只有一台tomcat服务时,如果 ...
- Spring Clould负载均衡重要组件:Ribbon中重要类的用法
Ribbon是Spring Cloud Netflix全家桶中负责负载均衡的组件,它是一组类库的集合.通过Ribbon,程序员能在不涉及到具体实现细节的基础上"透明"地用到负载均衡 ...
- Spring Boot 负载均衡之外置session状态保存
在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而打到另外一台服务器的时候,session丢失. 常规的解决方 ...
- Spring Cloud-Ribbon负载均衡策略类IRule(五)
IRule IRule AbstractloadBalancerRule 负载均衡策略抽象类 负责获得负载均衡器 保存在内部 通过负载均衡器维护的信息 作为分配的依据 public abstract ...
随机推荐
- 【资源共享】eBook分享大集合
传送门:[GitHub] 欢迎各位指点,要是能补充更是感激不尽. 主要以IT领域经典书籍收藏,以备不时之需,不一定都能看完,权且当做收藏好玩. [x] 表示文件大小超过100M(LFS). 服务器系统 ...
- net core Webapi基础工程搭建(六)——数据库操作_Part 1
目录 前言 SqlSugar Service层 BaseService(基类) 小结 前言 后端开发最常打交道的就是数据库了(静态网站靠边),上一篇net core Webapi基础工程搭建(五)-- ...
- 小白学Python(7)——利用Requests下载网页图片、视频
安装 Requests 如果安装了Requests就已经可用了,否则要安装 Requests,只要在你的CMD中运行这个简单命令即可: pip install requests requests使用 ...
- 服务注册发现、配置中心集一体的 Spring Cloud Consul
前面讲了 Eureka 和 Spring Cloud Config,今天介绍一个全能选手 「Consul」.它是 HashiCorp 公司推出,用于提供服务发现和服务配置的工具.用 go 语言开发,具 ...
- arcgis三维球中加载2000坐标系出现错误(The tiling scheme of this layer is not supported by SceneView)
目前我们国家测绘地理信息的坐标体系基准是国家2000坐标系CGCS2000.各类地图组件如OpenLayers.Mapbox.Cesuim和ArcGIS Javascrip等都主要是支持WGS84(w ...
- Go语言学习——如何实现一个过滤器
1.过滤器使用场景 做业务的时候我们经常要使用过滤器或者拦截器(听这口音就是从Java过来的).常见的场景如一个HTTP请求,需要经过鉴权过滤器.白名单校验过滤.参数验证过滤器等重重关卡最终拿到数据. ...
- lua_基本语法
学习lua,首先应该了解热更新. 热更新:可以在不重新下载客户端的情况下更新软件内容.在使用软件过程中,我们经常会遇到这种情况:升级软件,没错,这就使用的是热更新. C#不能直接热更新,原因为:C#脚 ...
- 使用synchronized获取互斥锁的几点说明
在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确 ...
- .Net Core 2.2与Java 12性能对比
我发现基准游戏(https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/csharp.html)是一套非常好的基准测试. ...
- 2. Sentinel源码分析—Sentinel是如何进行流量统计的?
这一篇我还是继续上一篇没有讲完的内容,先上一个例子: private static final int threadCount = 100; public static void main(Strin ...