微服务架构Ribbon与OpenFeign的使用 【快速入门】

news2024/11/15 8:45:25

一、实现负载均衡🍉

1.什么是负载均衡🥝

通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。

根据负载均衡发生位置的不同,一般分为服务端负载均衡客户端负载均衡

服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡

而客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求

在这里插入图片描述

2.实现负载均衡🥝

我们在微服务调用关系中一般会选择****客户端负载均衡****,也就是在服务调用的一方来决定服务由哪个提供者执行.

演示:—手动完成负载均衡

在这里插入图片描述

package com.lzq.controller;

import com.lzq.Order;
import com.lzq.Product1;
import com.lzq.service.OrderSercice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Random;

@RestController
@RequestMapping
public class OrderController {
    @Autowired
    private OrderSercice orderSercice;
    @Autowired
    private RestTemplate restTemplate;

    @Autowired//在springcloud中封装一个DiscoveryClient类  该类可以获取注册中心的服务信息
    private DiscoveryClient discoveryClient;

    @GetMapping("/aaa")
    public String insert(int pid,int num){
        //通过DiscoveryClient类获取登记名为“lzq01”工程信息
        List<ServiceInstance> instances = discoveryClient.getInstances("lzq01");
        //通过随机数将随机获取服务器中的工程uri
        int i1 = new Random().nextInt(instances.size());
        ServiceInstance serviceInstance = instances.get(i1);
        String path = serviceInstance.getUri().toString();

        System.out.println(pid);
        //构建一个订单对象
        Order order=new Order();
        order.setUid(1);//未来登录后一定能获取当前用户信息。
        order.setUsername("阿娇");
        order.setNumber(num);
        //商品信息---调用商品微服务的接口。---如何调用商品微服务的接口?--远程调用。[1]借助rabbitmq  [2]http远程调用【在java端模拟浏览器调用】。
        //spring封装了http远程调用 RestTemplate.默认该类没有交于spring容器管理. 创建一个配置类 写一个方法@Bean注解

        Product1 product = restTemplate.getForObject(path+"/aaa/bbb/"+ pid, Product1.class);
        System.out.println(product);
        order.setPid(product.getPid());
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());

        int i=orderSercice.inset(order);
        return i>0?"下单成功":"下单失败";
    }
}

上面通过手动完成了负载均衡的调用,存在的问题: 它采用的随机负载均衡,如何我想使用轮询负载均衡策略。只能修改源代码。耦合。—springcloud提供了一个组件–可以灵活的完成负载均衡。–ribbon

3.基于Ribbon实现负载均衡-----组件🥝

什么是ribbon?🍓

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现,通过Spring Cloud的封装,可以让我们轻松地将面向服务的Rest模板请求自动转换成客户端负载均衡的服务调用。

Ribbon只具有负载均衡的能力,并不具有发送请求的能力。所以,需要配合服务通信组件,如:RestTemplate

在这里插入图片描述

  • ILoadBalancer:负载均衡器。
  • LoadBalancerBuilder: 负载均衡器构造器
  • ServerList: 服务列表
  • ServerListUpdater: 定时更新的服务列表
  • IRule: 路由策略
  • IPing: 服务嗅探工具

快速使用🍓

(1)告诉restTemplate使用ribbon完成负载均衡

在这里插入图片描述

package com.lzq;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableFeignClients//开启openfeign注解驱动
public class Qy165Lzq03Application {

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

    }

    @Bean
    @LoadBalanced//告诉restTemplate使用ribbon作为负载均衡器
    public RestTemplate aaa(){
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate;
    }

}

(2)修改controller

在这里插入图片描述

ribbon提供哪些负载均衡策略🍓

在这里插入图片描述
上面是ribbon内置的负载均衡策略,你也可以自定义负载均衡。

如何改变ribbon的负载均衡策略呢?—修改配置文件

在这里插入图片描述

#修改ribbon中的负载均衡策略为随机策略
lzq01.ribbn.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

在这里插入图片描述

二、openfeign完成服务调用🍉

resttemplate在完成服务调用时存在什么不好的。

当微服务项目存在大量的服务起始,我们使用restTemplate 会调用大量的IP接口这样使用起来会很麻烦

在这里插入图片描述

我们的编写程序的习惯: controller—server—dao

controller注入一个service对象—调用该对象中的方法并传递参数----返回结果交于controller层。

而openfeign它就可以完成我们编程的调用风格。

1.什么是OpenFeign🥝

OpenFeign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地方法一样简单, 只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了OpenFeign, OpenFeign负载均衡默认集成了 Ribbon, 所以在Nacos下使用OpenFeign默认就实现了负载均衡的效果。

2.完成openfeign的调用🥝

(1)依赖🍓

在这里插入图片描述

    <!--openfeign依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

(2)创建openfeign接口🍓

在这里插入图片描述

package com.lzq.feign;

import com.lzq.Product1;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(value = "lzq01")
public interface ProductFeign {
    //接口的方法  必须和被调用者的接口的参数一致
    @GetMapping("/bbb/{id}")
    public Product1 getByid(@PathVariable Integer id);//springcloud  扫描到@FeignClient注解时--生产一个代理实现类

}

(3)开启openfeign注解驱动🍓

在这里插入图片描述

package com.lzq;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableFeignClients//开启openfeign注解驱动
public class Qy165Lzq03Application {

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

    }

    @Bean
    @LoadBalanced//告诉restTemplate使用ribbon作为负载均衡器
    public RestTemplate aaa(){
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate;
    }

}

(4)修改controller🍓

在这里插入图片描述

package com.lzq.controller;

import com.lzq.Order;
import com.lzq.Product1;
import com.lzq.feign.ProductFeign;
import com.lzq.service.OrderSercice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Random;

@RestController
@RequestMapping
public class OrderController02 {
    @Autowired
    private OrderSercice orderSercice;
    @Autowired
    private ProductFeign productFeign;

    @GetMapping("/aaa")
    public String insert(int pid,int num){

        System.out.println(pid);
        //构建一个订单对象
        Order order=new Order();
        order.setUid(1);//未来登录后一定能获取当前用户信息。
        order.setUsername("阿娇");
        order.setNumber(num);

        Product1 product = productFeign.getByid(pid);
        order.setPid(product.getPid());
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());

        int i=orderSercice.inset(order);
        return i>0?"下单成功":"下单失败";
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Terraform(一)

IaC 自动化配置与编排神器 - Terraform 1. 相关概念1.1 什么是 IaCIaC 的两种实现方式IaC 的好处IaC 优点IaC 工具为什么 IaC 对 DevOps 很重要&#xff1f; 1.2 什么是 Terraform1.3 Terraform 的主要特性1.4 Terraform 架构1.5 Terraform 核心概念1.6 Terraform 生命周期1.7 …

高等数学❤️第一章~第二节~极限❤️无穷小量与无穷大量~无穷小量概念及其性质与比较详解

【精讲】高等数学中的无穷小量概念及其性质与比较 博主&#xff1a;命运之光的主页 专栏&#xff1a;高等数学 目录 【精讲】高等数学中的无穷小量概念及其性质与比较 导言 一、无穷小量的概念 二、无穷小量的性质 三、无穷小量的比较 四、无穷小量的应用 必需记忆知识点…

【C++刷题集】-- day4

目录 选择题​​​​​​​ 单选 编程题 计算糖果⭐ 【题目解析】 【解题思路】 进制转换⭐​​​​​​​ 【题目解析】 【解题思路】 选择题 单选 1、 有以下程序 #include<iostream> #include<cstdio> using namespace std; int main() {int m 0123, n 123…

(文章复现)售电市场环境下电力用户选择售电公司行为研究(附matlab代码)

参考文献&#xff1a; [1]孙云涛,宋依群,姚良忠等.售电市场环境下电力用户选择售电公司行为研究[J].电网技术,2018,42(04):1124-1131. 1.基本原理 1 .1演化博弈 与古典博弈理论相比较&#xff0c;演化博弈假设参与人是有限理性的&#xff0c;参与人会根据自己和他人的经验选…

【前端】网页开发精讲与实战 CSS Day 4

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;前端 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对你有…

Vue+Ts+Echart使用以及后台接口对接逻辑【实战】

官网传送门 一.echarts介绍 是一个js插件 性能好可流畅远行PC和移动设备 兼容主流浏览器 提供很多图标,用户且可自行修改。 2.使用npm安装 npm install echarts二.echarts基本使用、自定义图例、选择7天日期查询图表数据内容 获取本地时间以及当前时间前几天后几天 /*** 获…

安装Visual Studio Installer Projects 2022插件

VS主界面--扩展--管理扩展--搜索VS插件“Visual Studio Installer Projects 2022”并安装。

JavaWeb(5)——HTML、CSS、JS 快速入门

一、JavaScript 对象 二、JavaScript BOM对象 和 DOM对象 关于BOM主要对 Window 和 location 进行说明&#xff1a; 三、JavaScript 事件监听 事件绑定 常见事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

ORA-01122 ORA-01208 故障处理---惜分飞

数据库突然故障ORA-01122 ORA-01208,导致实例crash Tue Jul 11 09:06:43 2023 Thread 1 cannot allocate new log, sequence 254989 Private strand flush not complete Current log# 3 seq# 254988 mem# 0: E:\APP\ADMINISTRATOR\ORADATA\xff\REDO03.LOG Thread 1 advanced …

23款奔驰E300加装原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶&#xff0c;可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出&#xff0c;并且在关闭后能够立刻散去。车内气味不会永久改变&#xff0c;香氛…

javascript(js)组成及使用

组成&#xff1a; js是由核心ECMAScript、文档对象模型DOM、浏览器对象模型BOM三部分组成。 ECMAScript&#xff1a;定义了语言的语法、类型、语句、关键字、保留字、操作符、对象。有普通模式和严格模式的区分。文档对象模型(DOM)&#xff1a;由XML经过扩展用于HTML的应用程序…

代码随想录算法学习心得 45 | 300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组...

一、最长递增子序列 链接&#xff1a;力扣 描述&#xff1a;给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c…

Android 开发规范(基础版)

背景 项目的代码时间时间很长,经过太多人手,代码的规范性堪忧,目前存在较多的比较自由的「代码规范」,这非常不利于项目的维护,代码可读性也不够高。 分析现有项目的代码的情况,输出的『定制化规范』文档,用于提高代码的可读性和可维护性。 收益 对于个人:帮助团队写「…

最长递增子序列(力扣)动态规划 JAVA

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1&#xf…

路径规划算法:基于袋獾优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于袋獾优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于袋獾优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法袋獾…

【vueJs源码】阅读之vm.$watch函数

我们经常使用watch肯定知道它&#xff0c;他和computer一样都是数据发生变化都会触发它。今天我们就来了解一下它的原理。 他的用法 Vue.prototype.$watch function (expOrFn: string | (() > any),cb: any,options?: Record<string, any> ): Function这是vuejs源…

Redis数据类型 — String

目录 String类型的内部编码 存储字符串采用两种编码方式的优缺点 选择SDS的原因 存储整数型采用OBJ_ENCODING_INT的原因 String 类型的底层的数据结构实现主要是 long 和 SDS&#xff08;简单动态字符串&#xff09; 数据结构&#xff1a;SDShttps://blog.csdn.net/weixin…

六种最新智能优化算法(LSO、SWO、ZOA、EVO、KOA、GRO)求解23个基准测试函数(含参考文献及MATLAB代码)

一、六种算法简介 &#xff08;1&#xff09;光谱优化算法LSO 光谱优化算法&#xff08;Light Spectrum Optimizer&#xff0c;LSO&#xff09;由Mohamed Abdel-Basset等人于2022年提出。 参考文献&#xff1a;Abdel-Basset M, Mohamed R, Sallam KM, Chakrabortty RK. Light…

单链表基本操作(java)

单链表 一.自定义链表类二.自定义节点类三.链表中的基本方法1.头插法2.尾插法3.在任意位置插入4.删除第一次的关键字为key的节点5.删除所有关键字为key的元素6.是否包含关键字key7.获取链表长度8.遍历节点并输出9.清空链表 一.自定义链表类 public class MySingleList {Node h…

vue+element Cascader 级联选择器 > 实现省市区三级联动

vueelement Cascader 级联选择器 > 实现省市区三级联动 先看下实现效果吧&#xff08;嘻嘻&#xff09; 看完我们就开始啦 安装element-china-area-data1 npm install element-china-area-data5.0.2 -S上代码 <el-cascadersize"large":options"options…