4.1、RestTemplate 简介

RestTemplate是Spring Resources中一个访问RESTful API 接口的网络请求框架。
 
RestTemplate 的设计 则和其他 Spring Template (例如 JdbcTemplate JmsTemplate )类似,都
是为执行复杂任务提供了一个具有默认行为的简单方法。
 
RestTemplate 是用来消费 REST 服务的,所以 RestTemplate 主要方法都与REST的HTTp
协议的一些方法紧密相连,例如 HEAD 、GET 、POST 、PUT、DELETE和OPTIONS 等方法
这些方法在 RestTemplate 类对应的方法为 headForHeaders()、getForObject()、 
postForObject()、put()和 delete () 等。
 
RestTemplate 支持常见的 Http 协议的请求方法,例如 Post、 Put、 Delete ,所以用
RestTemplate 很容易构建 RESTful API 。

4.2、Ribbon 简介

负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式。
 
1.独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix 。
2.将负载均衡逻辑以代码的形式封装到服务消费者的客户端上,服务消费者客户端维护了一份服务提
  供者的信息列 ,有了信息列表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负
  载均衡的目的。
 
Ribbon是Netflix 公司开源的一个负载均衡的组件,它属于上述的第2种方式
是将负载均衡逻辑封装在客户端中,并且运行在客户端的进程里
 
Ribbon是一个经过了云端测试的 IPC库,可以很好地控制 HTTP和TCP 客户端的负载均衡行为。
 
Spring Cloud 构建的微服务系统中, Ribbon 作为服务消费者的负载均衡器
两种使用方式:  
1、 和RestTemplate 相结合
2、是和 Feign 相结合。(Feign 已经默认集成了 Ribbon) 
 
Ribbon 有很多子模块,但很多模块没有用于生产环境,目前 Netflix 公司用于生产环境的 Ribbon
子模块如下:

4.3、使用RestTemplate和Ribbon来消费

之前的案例中已经有了注册中心此时不在进行注册中心的代码实现
(之前关于Eureka的高可用中有两个端口的Eureka)
 
服务提供者的开发如下:
eureka-client地址:https://www.cnblogs.com/Mrchengs/p/10645860.html
是之前的工程进行改变的

ProviderService.java

package com.cr.eurekaclient.service;
import org.springframework.stereotype.Service; @Service
public class ProviderService { public String port(){
return "";
}
}

PortController.java

package com.cr.eurekaclient.controller;

import com.cr.eurekaclient.service.ProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class PortController { @Autowired
ProviderService providerService; @GetMapping("/port")
public String getPort(){
return providerService.port();
}
}

配置文件:

server.port=
spring.application.name=CLINET
#应用起名字spring.application.name=provider
#注册服务时使用服务的ip地址
eureka.instance.prefer-ip-address=true
#服务中心地址
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/

访问:

去注册中心可以看到此时的服务已经在注册中心注册:

这里的Application将会是消费者中引用的地址!!!

服务的消费者:

RibbonConfig.java

@Configuration
public class RibbonConfig { @Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}

RibbonController.java

@RestController
public class RibbonController {
@Autowired
RibbonService ribbonService; @GetMapping("/port")
public String port(){
return ribbonService.port();
}
}
RibbonService.java
@Service
public class RibbonService { @Autowired
RestTemplate restTemplate; public String port(){
return restTemplate.getForObject("http://CLINET/port",String.class);
}
}

http://CLINET/port中的CLIENT为注册中心中的Application中的值

EurekaRibbonClientApplication.java
@EnableEurekaClient
@SpringBootApplication
public class EurekaRibbonClientApplication { public static void main(String[] args) {
SpringApplication.run(EurekaRibbonClientApplication.class, args);
}
}

配置文件:

spring.application.name=eureka-ribbon-client
server.port=
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/
访问:localhost:8080之后、
看注册中心:

 

@LoadBalanced开启负载均衡功能

测试实现:

同时也将8090换成8089,使用maven进行打包

在cmd中运行两个项目:

此时8089、8090端口都可以进行访问

http://localhost:8088/port页面进行刷新请求

此似乎可以看到两个端口的服务都可以访问到!!
 
负载均衡器会轮流地请求CLIENT的两个实例中的“/port”请求

4.4、loadBalancerClient 简介

负载均衡器的核 类为 LoadBalancerClient
LoadBalancerCiient 可以获取负载均衡的服务提供者的实例信息

在工程中进行测试:

RibbonController.java

package com.cr.eurekaribbonclient.controller;

import com.cr.eurekaribbonclient.service.RibbonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class RibbonController {
@Autowired
RibbonService ribbonService; @GetMapping("/port")
public String port(){
return ribbonService.port();
} @Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/testRibbon")
public String testRibbon(){
ServiceInstance instance = loadBalancerClient.choose("CLINET");
return instance.getHost()+ ":" + instance.getPort();
}
}
继续运行项目:

LoadBalancerClient的choose("CLINET")方法可以轮流得到 eureka-client 的两个服务实例的信息
 
负载均衡LoadBalancerClient是从Eureka Client 获取服务注册列表信息的,并且将注册信息缓存一份
 
LoadBalancerCJient 调用 choose()方法时,根据负载均衡策略选择一个服务实例的信息,
从而进行了负载均衡
 
LoadBalancerClient 也可以不从 Eureka Client 获取注册列表信息,
这时需要自己维护 份服务注册列 信息
 
有两个不同 Uri 地址 (例如 example.com,google.com )的服务实例 ,通
stores.ribbon.listOfServers 来配 这些服务实例的 Uri
spring.application.name=eureka-ribbon-client
server.port=
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/
stores.ribbon.listOfServers:example.com,google.com
ribbon.eureka.enabled=false
package com.cr.eurekaribbonclient.controller;

import com.cr.eurekaribbonclient.service.RibbonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class RibbonController {
@Autowired
RibbonService ribbonService; @GetMapping("/port")
public String port(){
return ribbonService.port();
} @Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/testRibbon")
public String testRibbon(){
ServiceInstance instance = loadBalancerClient.choose("CLINET");
return instance.getHost()+ ":" + instance.getPort();
} //进一步说明
@GetMapping("/hi")
public String hi(){
ServiceInstance instance = loadBalancerClient.choose("stores");
return instance.getHost()+ ":" + instance.getPort();
}
}
测试:

 

 后期会对源码进行相关的分析!!!
 
 

4、Spring Cloud-负载均衡 Ribbon的更多相关文章

  1. spring Cloud负载均衡Ribbon

    Ribbon饥饿加载 默认情况下Ribbon是懒加载的.当服务起动好之后,第一次请求是非常慢的,第二次之后就快很多. 解决方式:开启饥饿加载 ribbon: eager-load: enabled: ...

  2. Spring Cloud 负载均衡初体验

    目录 服务搭建 1.注册中心--Eureka Server 2.服务提供方--Service Provider 3.服务消费方--Service Consumer 服务消费 Feign 与断路器 Hy ...

  3. Spring Cloud负载均衡:使用zuul作服务器端负载均衡

    1.目的: 本文简述Spring Cloud负载均衡之服务器负载均衡模式,使用组件为zuul. zuul作为Spring Cloud中的网关组件,负责路由转发.身份验证.请求过滤等等功能,那么我们可以 ...

  4. Spring Cloud负载均衡:使用Feign作客户端负载均衡

    有了一篇服务端负载均衡后,再来一篇客户端负载均衡,客户端负载均衡很简单,无需在zuul中做多余配置(本示例不引入zuul),只需要在客户端进行Feign引入和配置即可. 准备工作很简单,实现客户端负载 ...

  5. Spring Cloud 客服端负载均衡 Ribbon

    一.简介   Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署, ...

  6. Spring Cloud(Dalston.SR5)--Ribbon 中间层负载均衡

    Spring Cloud 集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,使用 @LoadBalanced 修饰的 RestTemplate 类拥有了负载均衡功能,在 Sprin ...

  7. Spring Cloud:使用Ribbon实现负载均衡详解(下)

    在上一篇文章(Spring Cloud:使用Ribbon实现负载均衡详解(上))中,我对 Ribbon 做了一个介绍,Ribbon 可以实现直接通过服务名称对服务进行访问.这一篇文章我详细分析一下如何 ...

  8. Spring Cloud第四篇 | 客户端负载均衡Ribbon

    ​ 本文是Spring Cloud专栏的第四篇文章,了解前三篇文章内容有助于更好的理解本文: ​Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...

  9. 2.【Spring Cloud Alibaba】实现负载均衡-Ribbon

    负载均衡的两种方式 如何实现负载均衡 目前已经实现让A总能找到B,如何实现负载均衡 负载均衡的两种方式 服务器端负载均衡 客户端负载均衡 使用Ribbo实现负载均衡 Ribbon是什么 ==Netfl ...

  10. SpringCloud学习系列之二 ----- 服务消费者(Feign)和负载均衡(Ribbon)使用详解

    前言 本篇主要介绍的是SpringCloud中的服务消费者(Feign)和负载均衡(Ribbon)功能的实现以及使用Feign结合Ribbon实现负载均衡. SpringCloud Feign Fei ...

随机推荐

  1. 错误:Attempted to load applicationConfig: [classpath:/application.yml] but snakeyaml was not found on the classpath

    MyEclipse导入工程,报错如下: ::42.187 [main] ERROR org.springframework.boot.SpringApplication - Application r ...

  2. Runtime 打开记事本

    package com.direct.str; import java.io.IOException; public class RunTimeDemo { /** * @param args */ ...

  3. django框架中form表单Post方法无法提交 Forbidden (403) CSRF verification failed. Request aborted.

    问题如图: 解决方法: 在视图函数中引入并使用装饰器 from django.views.decorators.csrf import csrf_exempt @csrf_exempt

  4. BZOJ1149 [CTSC2007]风玲

    Description Input Output 输出仅包含一个整数.表示最少需要多少次交换能使风铃满足Ike的条件.如果不可能满足,输出-1. Sample Input 6 2 3 -1 4 5 6 ...

  5. Liunx一些命令

    1.设置管理员的密码:sudo passwd root2.获取管理员权限su root3.查看IP地址sudo ifconfig -a4.创建一个文件sudo touch test.txt5.创建一个 ...

  6. 用CSS3/JS绘制自己想要的按钮

    我认为按钮的绘制分以下三个步骤 第一步,绘制按钮的轮廓 选择合适的html标签,设置轮廓的CSS /* html代码 */ <a href="#" class="b ...

  7. layui-table渲染不出来

    通过方法渲染 页面代码: <table id="tableList" lay-filter="clublist"></table> js ...

  8. 使用Hugo搭建个人博客站点

    Hugo是个什么东东这里直接忽略,想了解的请查阅其他资料,我们直接上手操作. 安装Hugo 到 Hugo Releases 下载对应的操作系统版本的Hugo二进制文件 解压后得到 hugo_0.17_ ...

  9. Angular1.x 基础总结

    官方文档:Guide to AngularJS Documentation   w3shools    angularjs教程  wiki   <AngularJS权威教程> Introd ...

  10. qss 对子控件的设置样式 使用setProperty --Qt 之 QSS(动态属性)

    https://blog.csdn.net/liang19890820/article/details/51693956 学习了 代码: 当鼠标划过控件时,设置样式 void CustomLabelW ...