springCloud Finchley 实战入门(基于springBoot 2.0.3)【四 Ribbon 服务容错保护】

spring Cloud Ribbon

Ribbon是一个基于HTTP和TCP协议的客户端负载均衡工具,他也是基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们很容易的将面向服务的REST模板请求自动转换成客户端负载均衡的调用。虽然Ribbon只是一个工具类框架,不像服务注册中心、配置中心、API网关那样需要独立部署,但是他几乎存在于每一个Srping Cloud构建的微服务和基础设施中。

客户端负载均衡

负载均衡在系统架构中是一个非常重要的,并且是不得不去实施的内容。因为负载均衡是对系统的高可用、网络压力的缓解和处理能力的扩容的一个重要的手段之一。我们通常说的负载均衡都是指服务端的负载均衡,其中服务端的负载均衡分为硬件负载均衡和软件负载均衡。硬件负载均衡主要通过服务器节点之间安装专门的负载均衡设备,而软件负载均衡则是通过在服务器安装一些具有负载均衡的软件来实现,比如:Nginx;
而客户端的负载均衡和服务端的负载均衡最大的不同点在于服务清单所存储的位置。在客户端负载均衡中,所有的客户端节点都维护着自己要访问的服务端清单。而这些服务清单均来自服务注册中心。

入门案例

我们接着上一篇的创建的service-user项目。我们在该项目中写一个业务接口实现。


15324818571.jpg

创建一个UserManagementController类。并且暴露一个get请求的服务接口;模拟返回用户数据。代码如下

@RestController
@Log
public class UserManagementController {

    @Value("${server.port}")
    String serverPort;
    
    @GetMapping("/listUsers")
    public String ListUsers() throws InterruptedException {
        /**
         * 模拟从数据库查询
         */
        List<Map<String, Object>> users = new ArrayList<Map<String, Object>>();
        for (int i = 1; i < 5; i++) {
            Map<String, Object> user = new HashMap<String, Object>();
            user.put("id", i);
            user.put("name", "小明" + i);
            users.add(user);
        }
        log.info("/listUsers, host:"+serverPort);
        return "服务器端口号:   " + serverPort + "   |   用户信息:   " + users.toString();
    }
}

这里说一个日志输出,我比较喜欢使用lombok,所以项目中的日志输出我都会使用这种方式来输出日志。
使用的方式很简单;
在pom.xml添加lombok的依赖

 <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
 </dependency>

然后我们在类名添加@Log注解就可以了,关于其他更多的用户,大家可以网上了解一下。

重启项目,访问http://localhost:8802/listUsers,如果有数据返回,则说明服务接口正常了。

1532482987004.png

到这里service-user的服务接口已经写好了。接下来我们就创建一个新的springBoot 类型的module,命名为"eureka-bussniss-service-user-client-ribbon"做为服务消费者。
创建的过程中我们选中Eureka-server和Ribbon两个依赖即可:


1532483177335.png

创建项目成功后,修改application.yml

spring:
  application:
    name: service-user-ribbon
server:
  port: 8901
eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:8762/eureka/,http://peer2:8763/eureka/

项目主类名添加@EnableEurekaClient注解,并且注入RestTemplate类。主类的代码如下:

@SpringBootApplication
@EnableEurekaClient
public class EurekaBussnissServiceUserClientRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaBussnissServiceUserClientRibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced //开启客户端负载均衡
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

上面的@LoadBalanced 注解表示开启客户端的负载均衡。
接下来,我们新建一个UserManagementRibbonClient请求类,实现负载均衡请求service-user服务,代码如下:

@RestController
@Log
public class UserManagementRibbonClient {

    @Value("${server.port}")
    private String port;

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/listUsersByRibbon")
    public String ListUsersByRibbon() {

        long start = System.currentTimeMillis();
        String result = this.restTemplate.getForObject("http://service-user/listUsers", String.class);
        long end = System.currentTimeMillis();
        log.info("Spend Time :"+(end-start));
        return result;
    }
}

说明:service-user 为服务名称, 一个服务名称对应多个主机IP和端口号,这样根据服务名调用就实现了负载均衡的功能。
这样服务消费者就已经创建好了,接下来我们来验证测试Ribbon负载均衡的请求。

我们先把服务提供者service-user开启两个分别对应端口8802和8803。启动的方式可以向之前服务注册中心的方式,也可以直接在Idea里面启动,这里我们选择在Idea启动。启动的方式:


1532484083723.png

修改这里,把single instance only的勾去掉。


1532484159323.png

启动完8802端口后,我们修改一个application.yml的port为8803,即可启动8803对应的服务了。
接着把"eureka-bussniss-service-user-client-ribbon"服务也启动了。
这个时候我们访问注册中心的面板信息,可以看到相关的服务实例已经注册到了注册中心了。


1532484522884.png

这个时候我们访问service-user-ribbon的接口地址:http://localhost:8901/listUsersByRibbon
这里可以看到接口响应信息轮询的返回8802和8803的信息。

1532484661718.png

1532484671894.png

到这里说明Ribbon已经实现负载均衡请求了。
项目的源码

接口的负载均衡已经实现了,当时这里就会有一个问题了,如果服务提供者service-user其中一个服务挂了,ribbon还是会负载均衡到这个挂掉的服务的。例如:8把002端口停掉,然后继续访问http://localhost:8901/listUsersByRibbon。我们会看到当接口负载到8802的时候就报错了。

1532485030017.png

只有负载到8803才正常,这里如果是生产环境是可能不能出现这张情况的。

如果我们使用过Nginx,就会知道Nginx有一种容灾的功能,就是如果nginx反向代理的其中一个服务节点挂了不能访问了,nginx会自动踢掉这个节点,不会代理到这个节点的。在spring cloud中的Hystrix组件的主要作用就是服务容错保护来实现这个功能的。

所以我们下一篇会使用Hystrix组件来实现客户端负载均衡的服务容错保护。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容