说明:

ribbon是spring-cloud中作为服务消费者的一种角色,客户端可以通过它来对服务提供者的服务进行消费,

比如本例中是服务提供者注册到注册中心,服务提供者提供了一个服务接口,返回一个hello字符串,我们通过ribbon将这个接口调用,再不暴露真实服务提供者的地址的同时,获取服务提供者的服务

前提:

按照之前几个教程,搭建出注册中心、服务提供者。这里可以使用分片的注册中心,也可以不使用,这里暂时定为使用之前搭好的分片注册中心,服务提供者仅提供一个即可。

准备工作:

1、启动注册中心

按照之前的教程,分别使用peer1和peer2进行启动两个分片的注册中心,如果是单节点直接启动项目即可

启动后可以查看下localhost:1111或localhost:1112,如图

2、启动服务提供者

这里为了查看负载均衡的情况,所以需要启动两个服务提供者

按照之前教程中,分别开启两个terminal进行指定端口启动(两个相同的服务也可以在各自的配置文件中配置不同的端口),两个终端指令分别如下:

cd target
java -jar SpringCloudDemo-0.0.1-SNAPSHOT.jar --server.port=8080
cd target
java -jar SpringCloudDemo-0.0.1-SNAPSHOT.jar --server.port=8081

启动结果:

至此,准备工作已经完成

正文:

1、ribbon服务搭建

新建一个maven项目,不使用模板即可。项目名为robbin-customer,导入依赖参考如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.hellxz</groupId>
<artifactId>ribbon-customer</artifactId>
<version>1.0-SNAPSHOT</version> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>RELEASE</version>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
</project>

新建springboot启动类,将RestTemplate交给Spring容器进行管理

 package com.cnblogs.hellxz;

 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate; /**
* @Author : Hellxz
* @Description: 消费应用
* @Date : 2018/4/16 15:45
*/
@EnableDiscoveryClient
@SpringBootApplication
public class CustomerApplication { @Bean //将此Bean交给spring容器
@LoadBalanced //通过此注解开启负载均衡
RestTemplate restTemplate(){
return new RestTemplate();
} public static void main(String[] args) {
SpringApplication.run(CustomerApplication.class, args);
}
}

在src/resources目录下创建一个application.yml进行配置注册信息相关,本文使用了分片的注册中心,单节点请配置一个defaltZone即可

server:
port: 9000 #为ribbon-customer指定服务端口 spring:
application:
name: ribbon-customer #指定应用名 #指定eureka注册中心地址
eureka:
client:
serviceUrl:
defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/

在启动类同级目录创建CustomerController,注入RestTemplate进行调用服务接口

 package com.cnblogs.hellxz;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; /**
* @Author : Hellxz
* @Description: 消费者应用
* @Date : 2018/4/16 15:54
*/
@RestController
public class CustomerController { @Autowired
//注入restTemplate
private RestTemplate restTemplate; @RequestMapping(value="/ribbon-customer", method=RequestMethod.GET)
public String helloCustomer(){
//这里注释掉,因为之前想当然使用了直链访问服务提供者的接口,这样是不会返回结果的,而且会报错
//return restTemplate.getForEntity("http://localhost:8080/hello",String.class).getBody();
//使用restTemplate调用微服务接口
return restTemplate.getForEntity("http://hello-service/hello", String.class).getBody(); }
}

注意:上述代码第24行给出了一个错误的演示,如果出现访问ribbon接口报错,出现白色报错页面,请检查这里

至此ribbon消费者应用搭建完成,启动测试

测试:

访问http://localhost:1111/    我们发现这个ribbon消费者应用已经注册到注册中心中了

访问http://localhost:9000/ribbon-customer

还记得服务提供者项目中的如图方法中如果有访问则会打印信息,因为启动了两个服务提供者,这里可以测试ribbon的负载均衡

查看服务提供者输出

而第二个终端没有,依旧显示到Resolving eureka endpoints via configuration这行

刷新页面查看终端,由于ribbon的默认负载均衡的实现是轮询的,所以可能出现多次访问同一服务,多刷新几次页面,一定会在另一个Termical中显示的!

结语:

Ribbon作为服务消费者,可以在用户获取到服务提供者提供的服务的同时,不向用户暴露接口地址。可以看到,这里调用服务接口的时候使用的是服务提供者的服务名代替主机名,这在服务治理框架中,这种特性很重要。

由于本人之前是先学的jhipster生成器,所以,提前预报一下,之后还会有一种名为Feign的技术可以替代Ribbon,本系列博客均为学习笔记,实际操作中,可能会存在一个应用既是服务提供者又是服务消费者的情况。

声明本文为本人学习笔记,如需转载,还请注明出处

SpringCloud(四)服务发现与消费:以ribbon为例的更多相关文章

  1. Spring-cloud(四)服务发现与消费:ribbon的使用

    说明: ribbon是spring-cloud中作为服务消费者的一种角色,客户端可以通过它来对服务提供者的服务进行消费, 比如本例中是服务提供者注册到注册中心,服务提供者提供了一个服务接口,返回一个h ...

  2. 笔记:Spring Cloud Eureka 服务发现与消费

    服务发现与消费,其服务发现的任务是由Eureka的客户端完成,而服务的消费任务由Ribbon.JerseyClient等完成,Ribbon是一个基于HTTP和TCP的客户端负载均衡器:使用Jersey ...

  3. Spring Cloud Eureka 服务发现与消费

    服务发现与消费,其服务发现的任务是由Eureka的客户端完成,而服务的消费任务由Ribbon.JerseyClient等完成,Ribbon是一个基于HTTP和TCP的客户端负载均衡器:使用Jersey ...

  4. springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

    相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...

  5. Spring Cloud 服务发现和消费

    服务的发现和消费 有了服务中心和服务提供者,下面我们来实现一个服务的消费者: 服务消费者主要完成两个任务——服务的发现和服务的消费,服务发现的任务是由Eureka客户端完成,而服务消费的任务是由Rib ...

  6. 服务发现与消费 --> Spring Cloud Eureka

    在上两篇文章中,我们已经搭建起微服务架构中的核心组件 服务注册 中心(包括单节点模式和高可用模式).同时, 还对上一章中实现的Spring Boot入门程序 做了改造. 通过简单的配置,使该程序注册到 ...

  7. Spring Cloud Eureka 5 (服务发现与消费-简单的robbin使用)

    通过上述介绍,我们已经有了服务注册中心和服务提供者 下面我们来尝试构建一个服务的消费者 它要完成两个功能,发现服务和消费服务,其中发现服务由eureka客户端完成,消费服务由ribbon完成. rib ...

  8. SpringCloud(四):服务注册中心Eureka Eureka高可用集群搭建 Eureka自我保护机制

    第四章:服务注册中心 Eureka 4-1. Eureka 注册中心高可用集群概述在微服务架构的这种分布式系统中,我们要充分考虑各个微服务组件的高可用性 问题,不能有单点故障,由于注册中心 eurek ...

  9. (4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费

    上一章说了  Consul服务注册  现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢? 1.找Consul要一台你需要的服务器 1.1 获取Consul下的所有注册的服务 u ...

随机推荐

  1. HDU 5191 Building Blocks

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5191 bc(中文):http://bestcoder.hdu.edu.cn/contests ...

  2. erlang节点互相ping,一个能ping通,另外一个不行。

    今天发现一个问题,2个erlang节点,1个主动ping另外一个不通,然后等待另外一个ping过来,2个节点才连通.记录一下. 首先,erlang节点的cookie是一致的.查了文档,cookie一致 ...

  3. Centos 7 环境下,如何使用 Apache 实现 SSL 虚拟主机 双向认证 的详细教程:

    1. testing ! ... 1 1 原文参考链接: http://showerlee.blog.51cto.com/2047005/1266712 很久没有更新LAMP的相关文档了,刚好最近单位 ...

  4. 教你配置使用阿里云 Maven 库,体验秒下 jar 包的快感

    鉴于国内的网络环境,从默认 Maven 库下载 jar 包是非常的痛苦. 速度慢就不说了,还经常是下不下来,然后一运行就是各种 ClassNotFoundException,然后你得找到残留文件删掉重 ...

  5. 【Django】Django—Form两种解决表单数据无法动态刷新的方法

    一.无法动态更新数据的实例 1. 如下,数据库中创建了班级表和教师表,两张表的对应关系为“多对多” from django.db import models class Classes(models. ...

  6. bzoj4815[CQOI2017]小Q的格子

    题意 不简述题意了,简述题意之后这道题就做出来了.放个原题面. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向 ...

  7. 【uoj#192】[UR #14]最强跳蚤 Hash

    题目描述 给定一棵 $n$ 个点的树,边有边权.求简单路径上的边的乘积为完全平方数的点对 $(x,y)\ ,\ x\ne y$ 的数目. 题解 Hash 一个数是完全平方数,当且仅当每个质因子出现次数 ...

  8. 【JavaScript】checkBox的多选行<tr>信息获取

    页面的列表table显示(后台model.addAttribute("page", page);传来page信息,page通过foreach标签迭代展示表格数据): <!-- ...

  9. Educational Codeforces Round 33 (Rated for Div. 2) 题解

    A.每个状态只有一种后续转移,判断每次转移是否都合法即可. #include <iostream> #include <cstdio> using namespace std; ...

  10. [AT2148] [arc063_c] Integers on a Tree

    题目链接 AtCoder:https://arc063.contest.atcoder.jp/tasks/arc063_c 洛谷:https://www.luogu.org/problemnew/sh ...