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

一、实现负载均衡🍉

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?"下单成功":"下单失败";
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(Onenet)STM32L+BC20+MQTT协议传输温湿度,ADC,电压,GPS数据到Onenet物联网平台

1、材料准备 准备以下材料 2、设备连接 2.1 插入物联网卡 首先把BC20核心板从开发板上拆下来 然后将物联卡放置在BC20核心板内 物联卡放置完成将BC20核心板重新插入到开发板内&#xff08;注意不要弄错方向&#xff09; 同时接入天线 2.2 连接ST-Link仿真器 用3条杜邦线接…

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案

1.非注解式实现 2.1使用之前要明确使用的业务场景 例如我们在登录时&#xff0c;可以让redis缓存验证码&#xff0c;又如在分类下显示菜品数据时&#xff0c;我们可以对分类和菜品进行缓存数据等等。 2.2导入Redis相关依赖 <dependency><groupId>org.springfra…

vue3 前端编码规范

prettier 配置 1. vscode 安装prettier 的 插件 2. 新建 .prettierrc 文件 {"semi": false, // 不尾随分号"singleQuote": true, // 使用单引号"trailingComma": "none" // 多行逗号分隔的语法&#xff0c;最后一行不加逗号 }eslin…

数据库应用:MySQL备份与恢复

目录 一、理论 1.数据备份 2.完全备份与恢复 3.完全备份与恢复应用 4.增量备份与恢复 5.增量备份与恢复应用 6.使用脚本备份 7.日志管理 二、实验 1.完全备份与恢复 2.增量备份与恢复 3.使用脚本备份 三、问题 1.mysqldump报错 四、总结 一、理论 1.数据备份 …

HDFS与MapResource笔记

客户端向NN请求上传文件 NN回应可以上传 请求上传块,返回DN 所以后面就比较慢 找最近的服务器进行 64K发到1节点,1节点立刻发给2节点,同时1节点自动开始落盘,这里,3个节点是同时落盘的. 因为缓存是在内存中,而持久化是将数据存到磁盘上. 副本节点选择: 1.安全:放不同机架 2.速…

销售易的12年与七个瞬间

导读&#xff1a;企业级没有捷径 12年对一家企业意味着什么&#xff1f; 在消费互联网领域&#xff0c;12年足够长&#xff0c;短短几年内上市的故事过去屡见不鲜。在企业服务的toB领域&#xff0c;产业成熟和企业发展的时间维度被拉长&#xff0c;但故事同样精彩。 2023年7月1…

flask实现get和post请求

1、实现get请求 在项目根目录创建app.py 代码如下&#xff1a; from flask import Flask,render_template,requestapp Flask(__name__)app.route("/regist/user/", methods[GET]) def regist():return render_template("regist.html") #默认去templat…

招聘小程序制作:连接人才与企业

随着人才市场的竞争日益激烈&#xff0c;招聘小程序成为了企业寻找优秀人才和求职者找到理想工作的重要工具。通过招聘小程序&#xff0c;企业可以发布招聘信息、筛选简历&#xff0c;而求职者可以浏览职位、提交简历等。 招聘小程序的好处 精准匹配人才&#xff1a;招聘小程序…

Java二叉树

目录 一、树形结构 1.1 概念 1.2 树的性质 1.3 树的表示形式 二、二叉树 2.1 概念 2.2 两种特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储 2.5 二叉树的基本操作 2.5.1 二叉树的遍历 2.5.2 二叉树的基本操作 一、树形结构 1.1 概念 树是一种非线性的数据结构&#xff0…

Linux搭建node环境-MobaXterm+node+pm2安装

1.登录session 2.安装X11-forwarding 我也不知道这个有什么用&#xff0c;但是有个叉叉在那里有点难受&#xff0c;就把它解决了什么是X11-forwarding&#xff1f;怎么使用&#xff1f; yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Ty…

如何将jar 包下载到自定义maven仓库

下载命令 mvn install:install-file -Dfileartifactid-version.jar -DgroupIdgroupid -DartifactIdartifactid -Dversionversion -Dpackagingjar -DlocalRepositoryPath. -DcreateChecksumtrue参数解释 在上述命令中&#xff0c;需要替换以下参数&#xff1a; artifactid-vers…

SQL中为何时常见到 where 1=1?

你是否曾在 SELECT 查询中看到过 WHERE 11 条件。我在许多不同的查询和许多 SQL 引擎中都有看过。这条件显然意味着 WHERE TRUE&#xff0c;所以它只是返回与没有 WHERE 子句时相同的查询结果。此外&#xff0c;由于查询优化器几乎肯定会删除它&#xff0c;因此对查询执行时间没…

cocosCreator 3.6以上接入腾迅Bugly 捕捉JS错误 Android

cocosCreator3.6以上接入Bugly上报其实很简单&#xff0c;不需要网上那么多弯弯绕&#xff0c;三须三步走。 1. 按照官网方式接入android的bugly 2. android端写一个Bugly上报管理类 3. 修改你工程目录下native\engine\common\Classes\目录下的Game.h, Game.cpp两个文件&…

基于python的爬虫实现

定义 爬虫&#xff08;Web crawler&#xff09;&#xff0c;也被称为网络爬虫、网络蜘蛛或网络机器人&#xff0c;是一种自动化程序&#xff0c;用于浏览互联网并收集网页内容。 基本原理 爬虫的工作原理是通过发送HTTP请求从网页服务器获取网页的内容&#xff0c;然后解析网…

计算机专升本基础笔记二 进制转换及二进制运算规则

进制转换及二进制运算规则 什么是进制&#xff1f;     进制就是进位计数制&#xff0c;是人为定义的带进位的计数方法。我们的时间就是六十进制(满60秒进一分钟&#xff0c;满60分钟进1小时&#xff09;&#xff1b;对于任何一种进制—X进制&#xff0c;就表示每一位上的数…

GUI-Menu菜单实例(颜色+线型菜单)

运行代码&#xff1a; //GUI-Menu菜单实例&#xff08;颜色线型菜单&#xff09; #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struc…

Java的数据结构-Map集合

文章目录 Map概述Map常用方法Map遍历元素的方法1.方法一&#xff1a;keySet()2.方法二&#xff1a;entrySet() HashMap Map概述 1、Map和collection没有继承关系2、Map集合以key和value的方式存储数据&#xff1a;键值对key和value都是引用数据类型。key和value都是存储对象的…

【LocalSend】开源跨平台的局域网文件传输工具,支持IOS、Android、Mac、Windows、Linux

工作前提条件&#xff1a;设备使用相同的局域网。 LocalSend is a cross-platform app that enables secure communication between devices using a REST API and HTTPS encryption. Unlike other messaging apps that rely on external servers, LocalSend doesn’t require …

【网络安全】渗透测试工具——Burp Suite

渗透测试工具Burp Suite主要功能详解 前言一、 Proxy模块1.1 界面布局1.1.1 菜单栏&#xff08;1&#xff09; 菜单栏 Burp&#xff08;2&#xff09; 菜单栏 project&#xff08;3&#xff09; 菜单栏 Intruder&#xff08;4&#xff09; 菜单栏 Repeater&#xff08;5&#x…

C# Modbus通信从入门到精通(2)——Modbus RTU协议原理

Modbus RTU是串行链路上的协议,也就是说Modbus RTU是通过串口通信来实现的,它可以通过RS232、RS485物理层的接口来实现,同时它也是一个主从协议,在同一时间总线上只能有一个主站和一个或多个(最多247)个从站。Modbus通信总是由主站发起,从站没有接收到主站的请求时不会发…