目录
- 1.Eureka
- 2.整合Eureka作为注册中心
- 2.1创建maven工程
- 2.2依赖配置(Eureka-Server)
- 2.3业务配置(Eureka-Client)
- 2.4服务调用流程
- 3.集成负载均衡
1.Eureka
你问我Eureka是什么,其实就是一个基于SpringBoot的Java程序。解压Eureka-server的jar包之后,可以清楚看到一个标准的Java目录结构(还有一些存放前端页面的static文件):
和nacos非常相似,只不过Eureka作为注册中心默认是将实例信息存放在eureka-server内存python中,这比较适用于开发环境与测试环境,生产环境中还是建议配置相应的数据库表,做好数据持久化。在启动方式上,二者大体相似,shell脚本,maven模块启动,docker镜像…都可以实现。
2.整合Eureka作为注册中心
给大家提供一个我已经整合好的demo(用户-支付的场景),实现了服务间的注册与发现,并且有数据库表的支持,可以进行简单的调用:https://gitee.com/lazy-sheep-java/cloud-eureka.git
2.1创建maven工程
创建一个父-子结构的maven工程,这个很简单点点点就好
2.2依赖配置(Eureka-Server)
作为独立的maven模块启动Eureka服务,只需要引入核心依赖,配置一个启动类,并配置相应路径端口即可提供服务:
<!--eureka服务端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
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客户端依赖--> www.devze.com <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
并在相应的模块中配置服务端的地址
直到这里,当启动eureka-server、user-service模块之后,登录http://127.0.0.1:10086
就会发现,Eureka-server作为注册中心已经成功注册了user-service服务,就像这样:
2.4服务调用流程
在一个订单服务(A)调用用户服务(B)的模型中,A服务从Eureka-server获取B服务的地址。在A服务中使用RestTemplate通过getForObject()方法发送HTTP请求到B服务的地址,并处理返回的响应将其封装为指定的对象。
这是一个最简单的调用链路。用非官方语言描述该过程,即A拿着B的使用说明书向B发消息并得到了回应,而Eureka正是那本说明书
当然,在生产环境中一个微服务不太可能只会有单实例,更多的是一服务多实例的形式,当被调用方接收到调用请求,会去做负载均衡的处理,从而将请求落到合适实例上。以此来实现高可用、高扩展、高伸缩…
3.集成负载均衡
首先给一个服务多部署几个实例:
效果就像这样:
以前我们拉取的是某个服务的那个实例,现在则是拉取某个服务的实例列表。并在此基础上通过负载均衡将发来的请求指定到其中的某一实例上。
那要怎么实现呢?
只需要在服务调用方添加一个注解即可,最简单的方式就是这样:
@Bean @LoadBalanced //负载均衡 public RestTemplate restTemplate() { return new RestTemplate(); }
其实,在ResphptTemplate内部继承了一个拦截器(实现请求的转发,也就是负载均衡),而@LoadBalance注解则是帮助开启了该功能
注解本身是没有实现相关功能的(后面分析实现原理):
言归正传
现在我们的user服务已经有三个实例,并且已经进入到了负载均衡的列表
我们用aop做一个切面,来把负载均衡分发到服务实例上的信息以日志的形http://www.devze.com式打印到控制台,以便更直观地看到均衡的效果:
<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.yu7javascript.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的实例上:
负载均衡成功实现
以上就是SpringCloud集成Eureka并实现负载均衡的过程详解的详细内容,更多关于SpringCloud集成Eureka的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论