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

网站的空间的提供商亚马逊注册没有公司网站怎么做

网站的空间的提供商,亚马逊注册没有公司网站怎么做,网站广告赚钱怎么做,企业 北京 响应式网站上一篇文章中, 详细介绍了 Nacos 注册中心的原理, 相信看完后, 大家应该完全掌握了 Nacos 客户端是如何自动进行服务注册的, 以及 Nacos 客户端是如何订阅服务实例信息的, 以及 Nacos 服务器是如何处理客户端的注册和订阅请求的; 本文承上启下, 在订阅服务实例的基础上, 介绍如…

上一篇文章中, 详细介绍了 Nacos 注册中心的原理, 相信看完后, 大家应该完全掌握了 Nacos 客户端是如何自动进行服务注册的, 以及 Nacos 客户端是如何订阅服务实例信息的, 以及 Nacos 服务器是如何处理客户端的注册和订阅请求的;

本文承上启下, 在订阅服务实例的基础上, 介绍如何在实例之间进行选择, 实现负载均衡; 并详细介绍了负载均衡组件 LocaBanlancer 和函数式调用组件 OpenFeign 是如何与 Nacos 注册中心进行集成的;

如果在阅读过程中对文中提到的 SpringBoot 启动过程以及扩展机制不太了解, 或者对 @Import 注解不了解, 参考这篇文章 SpringBoot启动流程与配置类处理机制详解, 附源码与思维导图, 强烈建议学习后再来读本文;

LoadBalancer

  1. Nacos 1.X 版本自动引入 Ribbon 依赖, 使用 Ribbon 做负载均衡;

  2. Nacos 2.X 版本就没有了, 因为 Ribbon 的特性已经不满足 SpringBoot 的要求;

  3. 2.X 版本可以用 SpringCloud 团队提供的 LoadBalancer 组件来做负载均衡;

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

LoadBalancerClient

Spring Cloud LoadBalancer :: Spring Cloud Commons

  1. SpringCloud 定义的接口, 用于负载均衡地选择服务实例, 是SpringCloud制定的负载均衡规范;

  2. 由具体厂商去实现这个接口, 比如 Ribbon 和 LoadBanlancer 都提供了实现类;

    例如 LoadBalancer 包下 spring.factories 指定了自动配置类BlockingLoadBalancerClientAutoConfiguration;

    这个配置类向 Spring 容器注册了一个 BlockingLoadBalancerClient bean;

    这样就可以使用 @Autowired 注解获取 LoadBalancerClient并使用;

  3. 两个关键方法, chooseexecute

    choose 方法底层实现本质上仍然是调用了NamingService ( 使用 Nacos 时自然就是NacosNamingService )的 selectInstances 方法, 订阅服务并获取所有实例, 然后根据负载均衡算法选择一个实例返回;

  4. execute 方法有两个重载, 一个需要传入具体的 ServiceInstance, 一个不需要;

    调用不传 Instance 的 execute 方法时, 底层实现会先调用 choose 方法选出一个实例, 然后调用有 Instance 参数的 execute 方法完成请求发送;

  5. 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);}
}
  1. 或者使用@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 {@BeanReactorLoadBalancer<ServiceInstance> 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);}
}
  1. @EnableFeignClients 注解通过 @Import注解引入了一个ImportBeanDefinitionRegistrar; 其注册方法如下:

    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {// .....一些不重要的代码this.registerDefaultConfiguration(metadata, registry);this.registerFeignClients(metadata, registry);
    }
    

registerFeignClients

  1. 拿到 @EnableFeignClients 注解的属性;

  2. 创建一个空 Set, 保存 BeanDefinition;

  3. 看你的 @EnableFeignClients 注解的 clients 属性是否为空, 如果不为空, 就遍历该属性指定的类, 创建BeanDefinition, 放到 Set 中;

  4. 如果clients为空, 就根据 value 属性和 basePackages属性和 basePackageClasses 属性指定的值去扫描包, 找到有@FeignClient注解修饰的类, 创建 BeanDefinition, 添加到 Set;

    如果这些属性都为空, 就扫描启动类所在的包;

    basePackageClasses 用法: 该注解指定的类所在的包将被扫描;

  5. 遍历 Set , 获取 BeanDefinition 的 AnnotationMetadata, 进而拿到 @FeignClient 注解的 name 属性( 表示服务名 );

  6. 调用registerFeignClient , 向容器中注册当前 BeanDefinition 对应的一个 FactoryBean;

registerFeignClient

  1. 创建一个FeignClientFactoryBean, 在其 getObejct 方法中, 封装了创建代理对象的逻辑;
  2. getObject方法层层调用, 最终调用了ReflectiveFeign中的一个方法, 该方法使用 JDK 动态代理, 为 @FeignClient 注解修饰的接口, 创建了代理对象;
  3. FeignClientFactoryBean 的 BeanDefinition 添加Spring容器中;

动态代理

  1. 动态代理使用的 InvocationHandlerFeignInvocationHandler (最终是SynchronousMethodHandler)
  2. Handler 的 invoke 方法中, 又经过层层调用, 最终执行了如下逻辑:
  3. 获取 @FeignClient 注解的 name 属性, 通过LoadBanlancerClient 负载均衡地获取一个实例; (所以类加载路径下必须有 LoadBalancerClient 的实现类才行, 换言之, 必须引入 Ribbon 或 LoadBanlancer 之类的组件)
  4. 然后根据被调用的方法的 Mapping 注解, 得到请求路径; 和实例的地址进行拼接, 得到最终的请求地址;
  5. 然后通过 HTTP 工具发送请求;
http://www.yayakq.cn/news/35963/

相关文章:

  • 做网站的网站赚钱吗安卓网页编辑器
  • 网站规划建设方案akcms做的网站
  • 合肥网站建站推广python php网站开发
  • 特色的佛山网站建设wordpress 获取微博
  • 深圳招聘一般在哪个网站汕头网站建设套餐
  • 网站跳出率高珠海网站开发维护科技公司
  • 学校的网站怎么做头条小程序
  • 徐州建立网站北京哪里做网站好
  • 一个主机放几个网站怎么建设银行网站打不开
  • 做全网vip电影网站违法吗我的网站被黑了
  • 怎么建设回收网站百度手机助手安卓版下载
  • 辽宁城市建设职业技术学院教务网站大连网站开发哪家好
  • 宝塔怎么做网站的301跳转自己有产品怎么网络销售
  • 学用php做网站免费咨询保险
  • 查找全国免费网站建设头条新闻最新消息
  • 华企网站建设推广优化wordpress 插件 慢
  • 上海网站营销怎么样福田附近公司做网站建设哪家效益快
  • php 企业网站源码互联网行业五行属什么
  • 沈阳大十字街附近做网站公司大学专业宣传网站开发课题意义
  • 资源网站推荐几个网页设计师需要学什么技能
  • 房地产网站做编辑刚刚入行百度指数第一
  • 网页制作模板水果深圳seo优化排名推广
  • 北京企业官网网站建设门户网站建设理由
  • 我想做网站 怎么做呢潍坊做网站的网络公司
  • 淮安市盱眙县建设局网站wordpress 主题 轮播
  • 什么视频直播网站做挣钱做游戏特效的网站
  • 中国采购网官方网站企业网站设置费用
  • 建设部网站注销一级建造师电子商务网站建设参考文献书籍
  • 武钢建工集团建设分公司网站稿定设计在线制作官网
  • 用单页做网站 文章直接写上去 百度收录关键词吗自动水wordpress