吉林省白山市建设厅网站首页,企业服务中心怎么改成创作者服务中心,网站开发技术与应用试验报告4,有关西安的网页设计目录
一#xff1a;Eureka注册中心
1. Eureka原理
2. 动手实践
①搭建EurekaServer
②服务注册
③服务发现
二#xff1a;Ribbon负载均衡
1. 负载均衡原理
2. 负载均衡策略
3. 懒加载 一#xff1a;Eureka注册中心 前面已经分析了#xff0c;无论是SpringCloud还…目录
一Eureka注册中心
1. Eureka原理
2. 动手实践
①搭建EurekaServer
②服务注册
③服务发现
二Ribbon负载均衡
1. 负载均衡原理
2. 负载均衡策略
3. 懒加载 一Eureka注册中心 前面已经分析了无论是SpringCloud还是SpringCloudAlibaba两者的注册中心都有Eureka所以现在就来学习一下Eureka。 Dubbo SpringCloud SpringCloudAlibaba 注册中心 zookeeper、Redis Eureka、Consul Nacos、Eureka 服务远程调用 Dubbo协议 Feignhttp协议 Dubbo、Feign 配置中心 无 SpringCloudConfig SpringCloudConfig、Nacos 服务网关 无 SpringCloudGateway、Zuul SpringCloudGateway、Zuul 服务监控和保护 dubbo-admin功能弱 Hystix Sentine 1. Eureka原理
服务调用出现的问题 ①服务消费者该如何获取服务提供者的地址信息--------》注册中心 ②如果有多个服务提供者消费者该如何选择--------》负载均衡 ③消费者如何得知服务提供者的健康状态--------》心跳反应 Eureka的原理
在Eureka的结构当中分为两个角色 第一个角色eureka-server注册中心服务端记录和管理微服务。 第二个角色user-service服务提供者和 order-service服务消费者不管是服务者还是消费者都是微服务所以提供者和消费者统称为Eureka的客户端client。 ①user-service在启动的那一刻会把自己的信息注册给eureka注册中心会记录服务器名称、IP端口等信息。此时如果有人想消费就不需要自己去记录信息直接找eureka拉取服务器信息这实际上就解决了上述的第一个问题。
②例如此时拿到了3个记录信息如何选呢通过负载均衡的知识选出来一个然后就可以远程调用发请求这就解决了上述的第二个问题。
③那选出来的这个会不会是挂的呢不会因为提供者服务每隔30秒都会向eureka发一次心跳来确认自己的状态如果检测到不跳了、挂了eureka就会把它从注册中心的列表中剔除掉消费者就可以拉取到最新的信息这就解决了上述的第三个问题。 总结在Eureka架构中微服务角色有两类
1EurekaServer服务端注册中心 作用记录服务信息进行心跳监控。 2EurekaClient客户端
Provider服务提供者例如上述的 user-service ①注册自己的信息到EurekaServer。 ②每隔30秒向EurekaServer发送心跳。 Consumer服务消费者例如上述的 order-service ①根据服务名称从EurekaServer拉取服务列表。 ②基于服务列表做负载均衡选中一个微服务后发起远程调用。 2. 动手实践 接下来就动手实践总共分为三个部分搭建注册中心、服务注册、服务发现。 ①搭建EurekaServer 以下搭建信息是基于这篇博客的内容SpringCloud 【实用篇】| 服务拆分及远程调用http://t.csdnimg.cn/pj77E 第一步创建Maven的独立项目eureka-server引入spring-cloud-starter-netflix-eureka-server的依赖 注从这里也可以看出实际上Spring已经集成了Erueka直接引入依赖使用即可与我们后面学习的Nacos注册中心不同 ?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdcloud-demo/artifactIdgroupIdcn.itcast.demo/groupIdversion1.0/version/parentmodelVersion4.0.0/modelVersionartifactIdeureka-server/artifactIdpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.target/properties!--引入eureka起步依赖--dependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId/dependency/dependencies/project第二步编写启动类添加EnableEurekaServer注解表示自动装配的开关
package cn.itcast.eureka;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;SpringBootApplication
// 假如EnableEurekaServer注解
EnableEurekaServer
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class,args);}
}第三步添加application.yml文件配置信息
注为什么还要配置eureka的地址信息自己配置自己 答eureka自己也是一个微服务在启动时会将自己也注入到eureka上为了以后集群之间通信去用相互做注册进行通信。 #配置端口号
server:port: 10086
#eureka的服务器名称
spring:application:name: eureka-server
#eureka的地址
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka启动eureka进行访问 此时的注册列表就自己把自己注册进去了 ②服务注册 将user-service服务和order-service服务注册到EurekaServer已user-service为例步骤如下 第一步在项目user-service引入spring-cloud-starter-netflix-eureka-client的依赖
!--加如eureka的依赖--
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId
/dependency
第二步在application.yml文件编写下面的配置
spring:application:name: user-service #新加入的eureka服务器的名称
eureka: #新加入的eureka地址client:service-url:defaultZone: http://127.0.0.1:10086/eureka
启动order-service和user-service此时的注册列表 此时的注册列表就把order-service和user-service项目注册进去了 补充我们可以将user-service多次启动 模拟多实例部署但为了避免端口冲突需要修改端口设置 此时的eureka页面 此时对于注册进去的user-service启动了两个实列 ③服务发现 在order-service完成服务拉取服务拉取是基于服务名称获取服务列表然后在对服务列表做负载均衡。 第一步修改OrderService的代码修改访问的url路径用服务名代替ip、端口
// 原来是硬编码的方式写死了
String url http://localhost:8081/user/order.getUserId();
// 现在使用加入eureka注册中心的服务器名称代替IP和端口号
String url http://user-service/user/order.getUserId();
第二步在order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注解LoadBalanced
package cn.itcast.order;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;MapperScan(cn.itcast.order.mapper)
SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}// 注册RestTemplateBeanLoadBalanced // 加入负载均衡的注解public RestTemplate restTemplate(){return new RestTemplate();}}
此时重启order-service连续进行两次访问此时应该访问UserApplication---8081还是UserApplication2---8082呢
UserApplication日志信息显示 UserApplication2日志信息显示 发现两个是轮循方式访问成功实现了负载均衡至于负载均衡的原理下面会讲 总结
①搭建EurekaServer 引入eureka-server依赖 启动类上添加EnableEurekaServer注解 在application.yml中配置eureka端口号、地址、服务器名称 ②服务注册 引入eureka-client依赖 在application.yml中配置eureka地址、服务器名称 ③服务发现 用服务提供者的服务名称代替端口号和IP远程调用 给注入的RestTemplate添加LoadBalanced注解 二Ribbon负载均衡
前言对于高版本的SpringCloud的Ribbon组件已经弃用了被Spring Cloud Loadbalancer替代 前面我们用EurekaClient注册中心实现了服务的拉取和负载均衡我们只是指定了一个服务器的名称、加了LoadBalanced注解一切就自动完成了那么是什么时候进行的服务拉取什么时候进行的负载均衡负载均衡的原理是什么策略是什么接下来就学习SpringCloud的第二个组件Ribbon。 1. 负载均衡原理 order-service发起请求http://userservice/user/1实际上这个请求并不是真实可用的地址在浏览器是无法进行访问是无法到达后面某个服务的中间会被Ribbon把请求拦下来进行处理去找到真实的地址通过服务器名称userservice找eureka确定真实的地址IP和Port拉取服务然后做负载均衡。 源码分析 LoadBalanced注解就相当于一个标记标记RestTemplate发起的请要被Ribbon拦截。 // 注册RestTemplateBeanLoadBalanced // 假如负载均衡的注解public RestTemplate restTemplate(){return new RestTemplate();} 这个拦截的动作是通过LoadBalancerInterceptor类去完成的 这个类实现了ClientHttpRequestInterceptor接口客户端Http请求的拦截器会去拦截由客户端发起的Http请求而RestTemplate就是发Http请求的客户端。 package org.springframework.cloud.client.loadbalancer;import java.io.IOException;
import java.net.URI;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.util.Assert;public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {private LoadBalancerClient loadBalancer;private LoadBalancerRequestFactory requestFactory;public LoadBalancerInterceptor(LoadBalancerClient loadBalancer, LoadBalancerRequestFactory requestFactory) {this.loadBalancer loadBalancer;this.requestFactory requestFactory;}public LoadBalancerInterceptor(LoadBalancerClient loadBalancer) {this(loadBalancer, new LoadBalancerRequestFactory(loadBalancer));}// 重写的Intercept方法public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {URI originalUri request.getURI();String serviceName originalUri.getHost();Assert.state(serviceName ! null, Request URI does not contain a valid hostname: originalUri);return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));}
}在重写的intercept方法上打断点 浏览器发送localhost:8080/order/101请求回到断点 拿到地址后调用getHost方法拿到主机名 拿到服务器名称去找eureka完成服务的拉取把服务器名称交给loadBalancer去执行实际上loadBalancer对象就是一个RibbonLoadBalanceClient负载均衡客户端 execute方法就是执行的意思所以要跟进这个方法会进入RibbonLoadBalanceClient对象的excute方法一些版本的Jar包会进入接口LoadBalanceClient的excute方法在其实现类多打一个断点即可 这个ILoadBalancer对象实际上是DynamicServerListLoadBalance-动态服务列表负载均衡器就可以拿到对应的服务成功被拉取到服务列表 拉取到服务列表接下来就是进行负载均衡 此时getServer方法又调用了chooseServer方法又去转到ZoneAwareLoadBalancer类调用父类的chooseServer方法 最终调用到BaseLoadBalancer类的rule类的choose方法 rule类是一个IRule接口默认的负载均衡规则ZoneAvoidanceRule 这个接口还有其它负载均衡规则的实现类 负载均衡流程 2. 负载均衡策略 上面我们学写了负载均衡的原理知道IRule接口决定了负载均衡的策略接下来就分析IRule接口有哪些实现以及将来如何修改每个实现 Ribbon的负载均衡规则是一个叫做IRule的接口来定义的每一个子接口都是一种规则 常见的负载均衡策略 内置负载均衡规则类 规则描述 RoundRobinRule 简单轮询服务列表来选择服务器。 AvailabilityFilteringRule 对以下两种服务器进行忽略 1在默认情况下这台服务器如果3次连接失败这台服务器就会被设置为“短路”状态。短路状态将持续30秒如果再次连接失败短路的持续时间就会几何级地增加。 2并发数过高的服务器。如果一个服务器的并发连接数过高配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限可以由客户端的clientName.clientConfigNameSpace.ActiveConnectionsLimit属性进行配置。 WeightedResponseTimeRule 为每一个服务器赋予一个权重值。服务器响应时间越长这个服务器的权重就越小。这个规则会随机选择服务器这个权重值会影响服务器的选择。 ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。先分区域在区域内在轮循 BestAvailableRule 忽略那些短路的服务器并选择并发数较低的服务器。 RandomRule 随机选择一个可用的服务器。 RetryRule 重试机制的选择逻辑
通过定义IRule实现可以修改负载均衡规则有两种方式
第一种方式在OrderApplication启动类中注册新的Rule-------这是全局的配置
package cn.itcast.order;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;MapperScan(cn.itcast.order.mapper)
SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}// 注册RestTemplateBeanLoadBalanced // 加入负载均衡的注解public RestTemplate restTemplate(){return new RestTemplate();}// 修改负载均衡的规则---随机Beanpublic IRule randomRule(){return new RandomRule();}
} 第二种方式在application.yml文件中修改配置-------针对某个服务进行配置
user-service: # 给某个微服务配置负载均衡规则微服务的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则 3. 懒加载
Ribbon默认是采用懒加载即第一次访问时才会去创建LoadBalanceClient请求时间会很长。 而饥饿加载则会在项目启动时创建降低第一次访问的耗时通过下面配置开启饥饿加载
ribbon:eager-load:enabled: true # 开启饥饿加载clients是一个集合后面可以配多个clients:- user-service # 指定对user-service这个服务饥饿加载Ribbon负载均衡总结
①Ribbon负载均衡规则规则接口是IRule默认实现是ZoneAvoidanceRule根据区域选择服务列表然后轮询。
②负载均衡自定义方式 代码方式配置灵活但修改时需要重新打包发布 配置方式直观方便无需重新打包发布但是无法做全局配置 ③饥饿加载开启饥饿加载指定饥饿加载的微服务名称。