springcloud系列6——通过注册中心调用服务

标签: springcloud

前言

前面在注册中心已经注册了一个服务microservice-springcloud-user,这里我们在microservice-springcloud-movie中通过注册中心调用microservice-springcloud-user用户查询服务,并且实现负载均衡能力。

注意:这里不是直接通过microservice-springcloud-movie调用,是通过Eureka Server。

microservice-springcloud-movie增加eureka client的依赖

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

application.yml增加eureka配置

server:
  port: 7901
spring:
  application:
    name: microservice-springcloud-movie
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka
  instance:
    prefer-ip-address: true
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

MovieController修改

@GetMapping("/user/{userId}")
public User getUser(@PathVariable Long userId) {
    return restTemplate.getForObject("http://microservice-springcloud-user/sample/" + userId,User.class);
}
这里是通过注册到注册中心的服务名称来调用(microservice-springcloud-user中spring.application.name)。

启动类修改

@SpringBootApplication
@EnableEurekaClient
public class App 
{
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main( String[] args )
    {
        SpringApplication.run(App.class,args);
    }
}

启动类2处修改:
* 增加@EnableEurekaClient;
* RestTemplate增加@LoadBalanced,表示开启客户端负载均衡。

负载均衡测试

  • 1.启动microservice-discovery-eureka;
  • 2.启动microservice-springcloud-user;
  • 3.修改microservice-springcloud-user的application.yml中server.port为其他值(比如7903),再启动microservice-springcloud-user;
  • 4.启动microservice-springcloud-movie
    浏览器输入http://localhost:8761/,可以看到2个user的service。如图:

浏览器输入http://localhost:7901/user/1,看控制台日志
microservice-springcloud-user其中一个打印了查询的SQL,刷新浏览器,可以看到microservice-springcloud-user另外一个打印了查询的SQL。多次执行,都是按顺序依次调用,实现了负载均衡。

Ribbon

springcloud的负载均衡是通过Ribbon实现的,是一个客户端的负载均衡组件,Ribbon实现了客户端的一些负载均衡算法,包括轮询(Round-Robin)、随机选择、最大可用策略等多种策略。
Ribbon负载均衡策略
* RoundRobinRule: 轮询策略,Ribbon以轮询的方式选择服务器,这个是默认值。所以示例中所启动的两个服务会被循环访问;
* RandomRule: 随机选择,也就是说Ribbon会随机从服务器列表中选择一个进行访问;
* BestAvailableRule: 最大可用策略,即先过滤出故障服务器后,选择一个当前并发请求数最小的;
* WeightedResponseTimeRule: 带有加权的轮询策略,对各个服务器响应时间进行加权处理,然后在采用轮询的方式来获取相应的服务器;
* AvailabilityFilteringRule: 可用过滤策略,先过滤出故障的或并发请求大于阈值一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个;
* ZoneAvoidanceRule: 区域感知策略,先使用主过滤条件(区域负载器,选择最优区域)对所有实例过滤并返回过滤后的实例清单,依次使用次过滤条件列表中的过滤条件对主过滤条件的结果进行过滤,判断最小过滤数(默认1)和最小过滤百分比(默认0),最后对满足条件的服务器则使用RoundRobinRule(轮询方式)选择一个服务器实例。
参考:https://www.jianshu.com/p/df9393755a05

Spring Cloud官方文档Ribbon的介绍:http://cloud.spring.io/spring-cloud-static/Edgware.SR1/single/spring-cloud.html#spring-cloud-ribbon

注意:Spring Cloud官方文档中在How to Include Ribbon一节中说,要加入Ribbon的starter依赖。实际上是不需要的,在spring-cloud-dependencies依赖中已经包含了Ribbon的starter。
或者idea模块依赖中也可以看到已经有Ribbon的依赖了。如图:

版权声明:本文为qincidong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qincidong/article/details/82378898

智能推荐

循环

与任何程序设计语言一样Java利用条件语句与循环结构确定流程控制,一下总结一下Java中的循环语句: while do while for switch 对于golang来说: switch非常灵活。从第一个expr为true的case开始执行,如果case带有fallthrough,程序会继续执行下一条case,不会再判断下一条case的expr,如果之后的case都有fallthrough,d...

1638 统计只差一个字符的子串数目(动态规划)

1. 问题描述: 给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串。换言之,请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对的数目。比方说, "computer" 和 "computation"...

websocket基本原理

HTTP中一个request只能有一个response。而且这个response也是被动的,不能主动发起 因此过去的服务端推送信息是通过客户端不停的轮询实现的 websocket是双向通信协议,提供了服务端主动推送信息的能力 需要客户端(浏览器)和服务端同时支持 如果经过代理的话,还需要代理支持,否则有些代理在长时间无通信时会自动切断连接 因此WS为了保证连接不被断掉,会发心跳 WebSocket...

mybatis+ehcache二级缓存

导入jar包 mapper.xml文件开启二级缓存 pojo类实现序列化接口 配置ehcache.xml 测试...

python+opencv实现图像拼接

任务 拍摄两张图片去除相同部分,拼接在一起 原图 结果 步骤 读取两张图片 使用sift检测关键点及描述因子 匹配关键点 处理并保存关键点 得到变换矩阵 图像变换并拼接 代码实现 扩展 这里对右边图像进行变换,右边变得模糊,可以修改代码对左边图像变换 这里只有两张图片拼接,可以封装实现多张图片拼接 可以修改代码实现上下图片的拼接...

猜你喜欢

python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)         本文主要目的是通过一个简单的小...

memmove函数与memcpy函数的模拟实现

memmove函数和memcpy函数都是在内存复制任意类型的,但是它俩也有区别。当源区域和目标区域有重复的,memmove函数会复制缓冲区重叠的部分,而memcpy相反,会报出未知错误。 下面给出两个函数的实现 首先,memmove函数。 实现的基本原理如下图。 具体代码如下: memcpy函数的实现很简单,就直接给出源代码了...

SpringFramework核心 - IOC容器的实现 - 总结

1. 概述 把Spring技术内幕第一章和第二章过了一遍,也做了一些笔记, 对IOC容器的实现有了一定皮毛理解,现在跟着源码再过一遍总结一下IOC容器的初始化,Bean的初始化的过程,做一下总结 ① IOC容器和简单工厂模式 在开始之前,先想想我们平时是怎么使用IOC容器为我们管理Bean的,假设我们要把下面的User类交给IOC容器管理 我们不想关心如何创建一个User对象实例的,仅仅在需要他的...

Python和Django的安装

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈  一、下载并安装Python Python 官方下载地址:http://www.python.org/ftp/python/ 我们这里选择的是 Python 2.7.2 。虽然目前最新版是Python 3.2.2, 但是Django目前还不支持 Python 3.2.2。 安装步骤很简单,双击安装包开...