当前位置: 首页 > news >正文

网站建设的风格上海大金空调网站建设

网站建设的风格,上海大金空调网站建设,广告设计制作图片,wordpress 新年插件上一篇文章中, 详细介绍了 Nacos 注册中心的原理, 相信看完后, 大家应该完全掌握了 Nacos 客户端是如何自动进行服务注册的, 以及 Nacos 客户端是如何订阅服务实例信息的, 以及 Nacos 服务器是如何处理客户端的注册和订阅请求的; 本文承上启下, 在订阅服务实例的基础上, 介绍如…上一篇文章中, 详细介绍了 Nacos 注册中心的原理, 相信看完后, 大家应该完全掌握了 Nacos 客户端是如何自动进行服务注册的, 以及 Nacos 客户端是如何订阅服务实例信息的, 以及 Nacos 服务器是如何处理客户端的注册和订阅请求的; 本文承上启下, 在订阅服务实例的基础上, 介绍如何在实例之间进行选择, 实现负载均衡; 并详细介绍了负载均衡组件 LocaBanlancer 和函数式调用组件 OpenFeign 是如何与 Nacos 注册中心进行集成的; 如果在阅读过程中对文中提到的 SpringBoot 启动过程以及扩展机制不太了解, 或者对 Import 注解不了解, 参考这篇文章 SpringBoot启动流程与配置类处理机制详解, 附源码与思维导图, 强烈建议学习后再来读本文; LoadBalancer Nacos 1.X 版本自动引入 Ribbon 依赖, 使用 Ribbon 做负载均衡; Nacos 2.X 版本就没有了, 因为 Ribbon 的特性已经不满足 SpringBoot 的要求; 2.X 版本可以用 SpringCloud 团队提供的 LoadBalancer 组件来做负载均衡; dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId /dependencyLoadBalancerClient Spring Cloud LoadBalancer :: Spring Cloud Commons SpringCloud 定义的接口, 用于负载均衡地选择服务实例, 是SpringCloud制定的负载均衡规范; 由具体厂商去实现这个接口, 比如 Ribbon 和 LoadBanlancer 都提供了实现类; 例如 LoadBalancer 包下 spring.factories 指定了自动配置类BlockingLoadBalancerClientAutoConfiguration; 这个配置类向 Spring 容器注册了一个 BlockingLoadBalancerClient bean; 这样就可以使用 Autowired 注解获取 LoadBalancerClient并使用; 两个关键方法, choose 和 execute choose 方法底层实现本质上仍然是调用了NamingService ( 使用 Nacos 时自然就是NacosNamingService )的 selectInstances 方法, 订阅服务并获取所有实例, 然后根据负载均衡算法选择一个实例返回; execute 方法有两个重载, 一个需要传入具体的 ServiceInstance, 一个不需要; 调用不传 Instance 的 execute 方法时, 底层实现会先调用 choose 方法选出一个实例, 然后调用有 Instance 参数的 execute 方法完成请求发送; LoadBalancerClient 使用, 可以通过直接注入 LoadBanlancerClient对象来使用 RequestMapping(/order/*) public class OrderController {AutowiredLoadBalancerClient loadBalancerClient;AutowiredRestTemplate restTemplate;GetMapping(loadbalancer)public String test0(){ServiceInstance instance loadBalancerClient.choose(stock-service);String url instance.getUri() /stock/test0;return restTemplate.getForObject(url, String.class);} }或者使用LoadBalanced注解, 注册有复杂均衡功能的 RestTemplate Bean LoadBalanced public RestTemplate restTemplate(){return new RestTemplate(); }GetMapping(loadbalanced) public String test1(){return restTemplate.getForObject(http://stock-service/stock/test0, String.class); }RestTemplate 持有一个 ClientHttpRequestInterceptor的链表; RestTemplate 发送请求之前会先调用这些 Interceptor 的拦截方法; 在 LoadBalancer 的自动配置类中, 会注入所有有LoadBalanced注解修饰的 RestTemplate bean, 并且会将一个LoadBalancerInterceptor对象放到这些 RestTemplate 对象的拦截器列表中; 这个拦截器会拦截 RestTemplate 发送的请求, 调用LoadBalancerClient不带 ServiceInstance 参数的 execute 方法发送请求; 实现负载均衡; 负载均衡策略 默认的是轮询策略RoundRobinLoadBalancer; 也可以选择RandomLoadBalancer, 这俩都是 SpringCloud 提供的; LoadBalancerClients({LoadBalancerClient(name order-service, configuration RandomLoadBalancerConfig.class),LoadBalancerClient(name stock-service, configuration RandomLoadBalancerConfig.class) })// 对所有服务有效 LoadBalancerClients(defaultConfiguration RandomLoadBalancerConfig.class)public class RandomLoadBalancerConfig {BeanReactorLoadBalancerServiceInstance randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);} }OpenFeign FeignClient(course-service) public interface CourseFeignClient {GetMapping(/feign/course)String course(); }FeignClient(student-service) public interface CourseFeignClient {GetMapping(/feign/stu)String course(); }EnableFeignClients public class OrderApp {public static void main(String[] args) {SpringApplication.run(OrderApp.class, args);} }EnableFeignClients 注解通过 Import注解引入了一个ImportBeanDefinitionRegistrar; 其注册方法如下: public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {// .....一些不重要的代码this.registerDefaultConfiguration(metadata, registry);this.registerFeignClients(metadata, registry); }registerFeignClients 拿到 EnableFeignClients 注解的属性; 创建一个空 Set, 保存 BeanDefinition; 看你的 EnableFeignClients 注解的 clients 属性是否为空, 如果不为空, 就遍历该属性指定的类, 创建BeanDefinition, 放到 Set 中; 如果clients为空, 就根据 value 属性和 basePackages属性和 basePackageClasses 属性指定的值去扫描包, 找到有FeignClient注解修饰的类, 创建 BeanDefinition, 添加到 Set; 如果这些属性都为空, 就扫描启动类所在的包; basePackageClasses 用法: 该注解指定的类所在的包将被扫描; 遍历 Set , 获取 BeanDefinition 的 AnnotationMetadata, 进而拿到 FeignClient 注解的 name 属性( 表示服务名 ); 调用registerFeignClient , 向容器中注册当前 BeanDefinition 对应的一个 FactoryBean; registerFeignClient 创建一个FeignClientFactoryBean, 在其 getObejct 方法中, 封装了创建代理对象的逻辑;其 getObject方法层层调用, 最终调用了ReflectiveFeign中的一个方法, 该方法使用 JDK 动态代理, 为 FeignClient 注解修饰的接口, 创建了代理对象;将 FeignClientFactoryBean 的 BeanDefinition 添加Spring容器中; 动态代理 动态代理使用的 InvocationHandler 是 FeignInvocationHandler (最终是SynchronousMethodHandler)Handler 的 invoke 方法中, 又经过层层调用, 最终执行了如下逻辑:获取 FeignClient 注解的 name 属性, 通过LoadBanlancerClient 负载均衡地获取一个实例; (所以类加载路径下必须有 LoadBalancerClient 的实现类才行, 换言之, 必须引入 Ribbon 或 LoadBanlancer 之类的组件)然后根据被调用的方法的 Mapping 注解, 得到请求路径; 和实例的地址进行拼接, 得到最终的请求地址;然后通过 HTTP 工具发送请求;
http://www.yingshimen.cn/news/65833/

相关文章:

  • 高端的金融行业网站开发设计房子的平面图
  • 婚纱制作网站头条新闻 最新消息条
  • 已有域名 搭建网站做网站明细范文
  • 怎样做网站导航界面seo技术最新黑帽
  • 买空间的网站好制作app开发制作
  • 菏泽哪家网站设计公司好珠宝企业的门户网站开发
  • 做图片网站 解决版权seo外链购买
  • 建站工具cms装修行业 网站建设
  • 向客户介绍网站建设的话本沈阳网站建站
  • 网站负责人彩色验照域名个人用户可以做企业网站吗
  • 淄博建设网站公司仓库管理系统数据库设计
  • tk域名注册网站聊城优化网站建设
  • 网站做二维码吗互联网营销师报名费
  • 网站彩票怎么做360建筑
  • wordpress 制作企业站国内电子商务网站有哪些
  • 微网站建设哪家强建设摩托车怎么样
  • wap网站e4a做app网站设计美工要怎么做
  • 网站建设介绍大全驻马店河南网站建设
  • 广州营销型网站建设团队网络规划与设计方案
  • 万网网站备案涟源市住房与城乡建设局网站
  • 大连seo网站无锡市新吴区建设环保局网站
  • 浙江振升建设有限公司网站全包圆装修公司
  • 如何 在网站上面做推广百度关键词快速优化
  • 苏州正规网站建设概况冬奥会网页设计素材
  • 公司建网站公司网页设计实验报告实验1
  • 苏州市住房和建设局网站现在做一个网站系统多少钱
  • 电影采集网站怎么做seo网站建设群发广告词
  • 中国网站建设公司有哪些内容专业3合1网站建设电话
  • 微网站如何建立软文撰写案例
  • 建立公司企业网站网页游戏广告平台网站建设