SpringCloud集成Eureka并实现负载均衡
前言辗转两家公司也算工作了泰半年,有幸见地过很多微服务架构,比如Dubbo+Redis的组合;Dubbo+Zookepper的组合;SpringCloud+Eureka的组合;SpringCloud+Nacos的组合…
每一种组合都有属于自己的故事。
笔者以为:流行的不一定是最好的,如果只学习最流行的技能,这对以后的发展是很受限的。作为后端我们还是须要追求一定的广度。在以后的职业生涯中碰到一些特别业务场景,才可以或许有更多的方案去机动应对!当向导让你做技能选型,你直接好几套方案往他眼前一摆,这真的很酷炫。
我想从当下最流行的SpringCloud体系谈起,从demo到底层循序渐进地整理出每一套组合,也非常希望可以或许对你起到一些绵薄的资助~
故事从Eureka(译文:发现你了)提及…
1.Eureka
你问我Eureka是什么,其实就是一个基于SpringBoot的Java步伐。解压Eureka-server的jar包之后,可以清晰看到一个标准的Java目录结构(另有一些存放前端页面的static文件):
https://i-blog.csdnimg.cn/blog_migrate/d9320393c0fb1cf3134d14c63d299634.png
和nacos非常相似,只不外Eureka作为注册中心默认是将实例信息存放在eureka-server内存中,这比较适用于开发情况与测试情况,生产情况中还是建议配置相应的数据库表,做好数据长期化。在启动方式上,二者大要相似,shell脚本,maven模块启动,docker镜像…都可以实现。
2.整合Eureka作为注册中心
下面采用将Eureka-server作为独立maven模块的方式启动来作为注册中心,其实本质也就是扫描运行Eureka-server的jar包而已,并在此过程中做一些人为配置:
2.1创建maven工程
创建一个父-子结构的maven工程,这个很简朴点点点就好
https://i-blog.csdnimg.cn/blog_migrate/8a06f35ff02d421aa5327c745e75d166.png
2.2依靠配置(Eureka-Server)
作为独立的maven模块启动Eureka服务,只须要引入核心依靠,配置一个启动类,并配置相应路径端口即可提供服务:
<!--eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
https://i-blog.csdnimg.cn/blog_migrate/8807d9581ccd71dfaf240c7d027722f9.png
server:
port: 10086 # 服务端口
spring:
application:
name: eureka-server # eureka的服务名称
eureka:
client:
service-url:# eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
2.3业务配置(Eureka-Client)
在业务模块中,都属于Eureka的客户端,其核心依靠为:
<!--eureka客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
并在相应的模块中配置服务端的地址
https://i-blog.csdnimg.cn/blog_migrate/d4b71c7ab40caa7f89c9b26e2574045b.png
直到这里,当启动eureka-server、user-service模块之后,登录http://127.0.0.1:10086就会发现,Eureka-server作为注册中心已经成功注册了user-service服务,就像这样:
https://i-blog.csdnimg.cn/blog_migrate/b9e1b5ed0608f67b5aa75ba4fe79b5c0.png
2.4服务调用流程
在一个订单服务(A)调用用户服务(B)的模型中,A服务从Eureka-server获取B服务的地址。在A服务中使用RestTemplate通过getForObject()方法发送HTTP哀求到B服务的地址,并处理处罚返回的响应将其封装为指定的对象。
https://i-blog.csdnimg.cn/blog_migrate/92f3d8b62b1e44c2f7bb4c1e33fdee2d.png
这是一个最简朴的调用链路。用非官方语言描述该过程,即A拿着B的使用阐明书向B发消息并得到了回应,而Eureka正是那本阐明书
固然,在生产情况中一个微服务不太可能只会有单实例,更多的是一服务多实例的形式,当被调用方接收到调用哀求,会去做负载均衡的处理处罚,从而将哀求落到合适实例上。以此来实现高可用、高扩展、高伸缩…
3.集成负载均衡
起首给一个服务多摆设几个实例:
https://i-blog.csdnimg.cn/blog_migrate/c72a6b6ed0fe9d6464f9353bc37f9aaf.png
效果就像这样:
https://i-blog.csdnimg.cn/blog_migrate/afce40f43ee02bdb71b682c34838bf41.png
以前我们拉取的是某个服务的那个实例,现在则是拉取某个服务的实例列表。并在此底子上通过负载均衡将发来的哀求指定到其中的某一实例上。
那要怎么实现呢?
只须要在服务调用方添加一个注解即可,最简朴的方式就是这样:
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
其实,在RestTemplate内部继承了一个拦截器(实现哀求的转发,也就是负载均衡),而@LoadBalance注解则是资助开启了该功能
https://i-blog.csdnimg.cn/blog_migrate/b5e7300f59d1a9e01d1ece5980821687.png
注解自己是没有实现相关功能的(背面分析实现原理):
https://i-blog.csdnimg.cn/blog_migrate/b5d167dba91ec6f90c1ff47158f3c090.png
言归正传
现在我们的user服务已经有三个实例,并且已经进入到了负载均衡的列表
https://i-blog.csdnimg.cn/blog_migrate/639fb1cd64a884ff1d1d1463fb6215ef.png
我们用aop做一个切面,来把负载均衡分发到服务实例上的信息以日记的形式打印到控制台,以便更直观地看到均衡的效果:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
注入Eureka客户端,通过提供的api来查询服务的客户端分发到的实例信息:
@Aspect
@Component
@Slf4j
public class RequestAspect {
@Resource
EurekaClient eurekaClient;
@Before(value = "execution(* com.yu7.user.web.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
String className = joinPoint.getTarget().getClass().getName();
log.debug("调用方法:{} ", className + "." + methodName);
InstanceInfo instanceInfo = eurekaClient.getApplicationInfoManager().getInfo();
log.debug("负载均衡到的实例信息为:{}",instanceInfo.getInstanceId());
}
}
当调用方再次发起哀求,观察控制台的信息,可以直接看到哀求被分发到了端口为8084的实例上:
https://i-blog.csdnimg.cn/blog_migrate/9bfd2e7c35dd98a6813888edc0d79e52.png
负载均衡成功实现
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]