浙江省建设网站徐叨法,长春网站建设 信赖吉网传媒,文创产品设计概念,公司如何登录网站做就业登记文章目录 一、Eureka1、服务提供者与消费者2、Eureka原理分析3、搭建Eureka4、服务注册5、模拟多服务实例启动6、服务的发现 二、Ribbon1、负载均衡的原理2、源码分析3、负载均衡策略4、饥饿加载 一、Eureka
1、服务提供者与消费者
服务提供者#xff1a;一次业务中#xf… 文章目录 一、Eureka1、服务提供者与消费者2、Eureka原理分析3、搭建Eureka4、服务注册5、模拟多服务实例启动6、服务的发现 二、Ribbon1、负载均衡的原理2、源码分析3、负载均衡策略4、饥饿加载 一、Eureka
1、服务提供者与消费者
服务提供者一次业务中被其它微服务调用的服务。提供接口给其它微服务
服务消费者一次业务中调用其它微服务的服务。调用其它微服务提供的接口 很明显这是一个相对的概念。
2、Eureka原理分析
上一篇中远程调用时url参数是写死在代码中的而不同的测试、生产、开发环境IP不同有集群时端口也不能固定。 很明显硬编码肯定行不通。Eureka就是来解决这个问题的。 每个服务启动的时候将自己的信息注册到eureka中某个服务需要调用其他服务时向eureka拉取对应的服务信息负载均衡到其中一台如图中的localhost:8081)进行远程调用服务实例向eureka心跳续约每30秒一次eureka监控到某个服务实例不再心跳时就从其注册信息中剔除这条信息。服务消费者拉取时当然也就拉取不到这个宕掉的服务实例新启动一个服务服务信息注册到了eureka中…以此类推 接下来开始搭建Eureka并进行服务注册和服务发现 3、搭建Eureka
在父工程下新建eureka模块选择Maven点击Finish 给该模块引入依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId
/dependency
!--版本在父工程中统一管理这里不用写--编写启动类添加EnableEurekaServer注解自动装配的开关
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;EnableEurekaServer
SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}
添加application.yaml文件
server:port: 10086 # 服务端口
spring:application:name: eurekaserver # eureka的服务名称eureka自身也是个微服务也要注册自己的信息到eureka注册中心
eureka:client:service-url: # eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka# eureka自身也是个微服务也要注册自己的信息到eureka注册中心
# 王思聪住万达酒店也得身份证登记一下虽然那就是他家的产业启动eureka模块 注册成功 4、服务注册
接下来将user和order服务注册到eureka中
在user模块的pom文件中引入eureka客户端依赖
!--eureka客户端依赖--
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId
/dependency在application.yaml文件中增加注册中心地址的配置
server:port: 8081
spring:application: name: userservice
eyreka:client:service-url: # eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka
重启user模块order模块操作步骤相同注册成功 5、模拟多服务实例启动
上面完成的注册都是单服务实例的接下来在IDEA中模拟启动多个服务实例
右键选择拷贝 -Dserver.port覆盖yaml文件中的端口从而换个新端口 启动这个新服务实例注册成功 6、服务的发现
接下来实现在order服务中完成服务信息的拉取然后通过负载均衡挑选一个user服务实现远程调用
服务拉取是基于服务名称获取服务列表然后在对服务列表做负载均衡
修改order代码将服务IP和端口改为服务名
String url http://userservice/user/ order.getUserId();在order启动类OrderApplication中的RestTemplate添加负载均衡注解
Bean
LoadBalanced
public RestTemplate restTemplate() {return new RestTemplate();
}分别调用order接口两次传参101和102看它远程调用了哪个user服务实例 可以看到两个服务实例均有对应的日志成功 二、Ribbon
1、负载均衡的原理
分析我在浏览器中直接访问http://userservice/user/访问失败这是因为userservice既不是可用域名也不是IP。那order调用到user服务的过程中经历了什么呢 order发起请求Ribbon拦截请求拿到服务名向eureka拉取信息eureka返回服务列表信息给RibbonRibbon将请求轮询到相应的服务地址上去
具体信息在源码中打断点来调试看看。
2、源码分析 LoadBalanced注解就标识了调用方当前这个restTemplate这个对象发起的请求要被Ribbon拦截 LoadBalancerInterceptor实现了ClientHttpRequestInterceptor接口 在LoadBalancerInterceptor接口重写的intercent方法上打断点调用order接口中途会对user服务发起远程调用断点进入到了这里 继续往下看到了Ribbon对象 继续往下成功从eureka拿到服务列表信息 继续往下调试看到了IRule这个接口决定了负载均衡的策略 以上调用接口http://localhost:8080/order/102后发生的事情如图
- 接口中途通过restTemple远程调用http://userservice/user/1
- 被负载均衡拦截器拦截
- 获取url中的服务id即userservice
- 动态服务列表均衡器向eureka拉取userservice的信息
- eureka返回服务列表给DynamicServiceListLoadBalancer
- 通过IRule挑选出某个服务返回给RibbonLoadBalancerClient
- 请求被转发到了某个一具体的实例上3、负载均衡策略
Ribbon的负载均衡策略是由IRule接口来定义的它的每一个子接口就是一种策略。 具体的含义为 以上策略中Ribbon默认的是ZoneAvoidanceRule。想修改负载均衡策略有这两种方法 代码方式在order-service中的OrderApplication类中定义一个新的IRule Bean
public IRule randomRule(){return new RandomRule(); //改为随机
}配置文件方式在order-service的application.yml文件中添加新的配置也可以修改规则 userservice: ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则此时多次调用order接口代码中途远程调用user)
http://localhost:8080/order/102可以看到转发到user实例上的请求不再有明显规律。
4、饥饿加载
重启order服务然后两次访问order接口发现耗时相差巨大 Ribbon默认是采用懒加载即第一次访问时才会去创建LoadBalanceClient因此请求时间会很长。
饥饿加载则会在项目启动时创建降低第一次访问的耗时通过下配置开启饥饿加载
ribbon:eager-load: enabled: true #开启饥饿加载clients: userservice # 指定对userservice这个服务饥饿加载# clients为list可添加多个