说明:

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,本系列博客均为学习笔记,实际操作中,可能会存在一个应用既是服务提供者又是服务消费者的情况。

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

Spring-cloud(四)服务发现与消费:ribbon的使用的更多相关文章

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

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

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

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

  3. Spring Cloud Eureka 服务发现 4.2

      在微服务架构中,服务发现可以说是最为核心和基础的模块,该模块主要用于实现各个微服务实例的自动化注册与发现.在Spring Cloud的子项目中,Spring Cloud Netflix提供了Eur ...

  4. Spring Cloud微服务开发笔记5——Ribbon负载均衡策略规则定制

    上一篇文章单独介绍了Ribbon框架的使用,及其如何实现客户端对服务访问的负载均衡,但只是单独从Ribbon框架实现,没有涉及spring cloud.本文着力介绍Ribbon的负载均衡机制,下一篇文 ...

  5. SpringCloud微服务实战一:Spring Cloud Eureka 服务发现与注册中心(高可用实列为两个注册中心)

    微服务架构: 微服务架构的核心思想是,一个应用是由多个小的.相互独立的.微服务组成,这些服务运行在自己的进程中,开发和发布都没有依赖.不同服务通过一些轻量级交互机制来通信,例如 RPC.HTTP 等, ...

  6. Spring Cloud 2-Eureka服务发现注册(一)

    Spring Cloud Eureka  1.服务端配置 pom.xml application.yml Application.java 2.客户端配置 pom.xml application.ym ...

  7. spring cloud(服务消费者(利用ribbon实现服务消费及负载均衡)——初学二)

    Ribbon是一个基于HTTP和TCP客户端的负载均衡器,利用ribbon实现服务消费,并实现客户端的负载均衡. 一.准备工作(利用上一节的内容) 启动服务注册中心 启动computer-servic ...

  8. spring cloud 注册、发现、消费、负载均衡

  9. 用ZooKeeper做为注册中心搭建基于Spring Cloud实现服务注册与发现

    前提: 先安装好ZooKeeper的环境,搭建参考:http://www.cnblogs.com/EasonJim/p/7482961.html 说明: 可以再简单的理解为有两方协作,一个是服务提供这 ...

  10. Spring Cloud 微服务的那点事

    什么是微服务 微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调 ...

随机推荐

  1. 【Python】 汉字转化汉语拼音pinyin

    pinyin pinyin模块是github上一个小项目,在github.com/cleverdeng/pinyin.py上面可以下到源码.衷心感谢那些为这个模块做出贡献的人来方便我们[鞠躬] 安装: ...

  2. Java基础学习笔记六 Java基础语法之类和ArrayList

    引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...

  3. Java基础学习笔记十三 常用API之正则表达式、Date、DateFormat、Calendar

    正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在 ...

  4. JavaScript Alert 函数执行顺序问题

    * { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...

  5. 第二次作业:软件分析之Steam的前世今生

    摘要:本次作业我将介绍一下Steam的相关内容,以及对Steam的相关调研测评,以及需求分析,最后就是对Steam的建议以及在中国的发展提出相应的建议 一.相关信息      Steam是一个整合游戏 ...

  6. Tornado websocket应用

    应用场景 WebSocket 的特点如下 适合服务器主动推送的场景(好友上线,即时聊天信息,火灾警告,股票涨停等) 相对于Ajax和Long poll等轮询技术,它更高效,不耗费网络带宽和计算资源 它 ...

  7. html{font-size:62.5%}

    为什么要使用html,body{font-size:62.5%}? 使用以下代码查看浏览器的初始font-size: <!DOCTYPE html><html><head ...

  8. 深入理解java的static关键字

    static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...

  9. 我的PCB电路设计(一)

    我的制板规则 过孔大小:14/24mil-(12/22-28/50)  一般过孔没必要太大.如果电流较大可以适当增大过孔,或者多加几个过孔 线宽大小:小信号线8mil,大电流线不等按1A电流30mil ...

  10. Python扩展模块——调用WindowsAPI(pywin32的简单使用)

    这块使用的比较少,只用到了模拟键盘按键, 调用鼠标比较费事,是通过像素坐标实现的,如果没有特殊需求或万不得已不建议使用 import win32con import win32api win32api ...