【SpringCloud】微服务技术栈入门1 - 远程服务调用、Eureka以及Ribbon

2023-09-21 11:45:00

远程服务调用

RestTemplate

RestTemplate 可以模拟客户端来向另外一个后端执行请求

黑马给出的微服务项目中,有两个 boot 项目,分别是 order 与 user

我们想要在 order 中的 service 阶段对 user 给出的接口执行请求,此时就需要 RestTemplate 来进行解决


首先需要在 OrderApplication,也就是项目入口点注册一个全局的 RestTemplate
后续可以使用自动装配直接调用该对象

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

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

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

修改 OrderService 的代码,借助 RestTemplate 请求拿到 user 后,存储到对应的 orde 对象中去

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    // 自动装配引入resttemplate
    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);

        // 设置后端服务器请求的URL
        String url = "http://localhost:10087/user/" + order.getUserId();
        // 请求后端服务器
        User forObject = restTemplate.getForObject(url, User.class);
        // 将请求结果保存到现有的order对象中去
        order.setUser(forObject);

        // 4.返回
        return order;
    }
}

Eureka

简要概念

服务调用关系

  • 服务提供者:暴露接口给其他微服务调用
  • 服务消费者:使用其他微服务提供的接口
  • 提供者和消费者角色是相对的,一个对象可以同时兼具这两种状态

在这里插入图片描述

Eureka 完整工作流程图及其简要步骤

Eureka 由两部分组成:Eureka-serverEureka-client
Eureka-client 又可划分为两个类别:服务消费者(consumer)与服务提供者(provider)

工作流程:

  1. 服务提供者 URL 发送给注册中心进行注册
  2. 注册中心来者不拒,一一把服务提供者的 URL 记录到表内
  3. 服务消费者从注册中心获取对应提供者 URL,进行接口请求
  4. 每隔 30s,服务提供者就会向注册中心发送心跳包来证明自己活着,否则隔一段时间不发的话就会被注册中心删除
  5. 服务消费者具备负载均衡的能力,可以选择最适合的那一个后端服务执行请求

配置 Eureka 环境

注意,请确保所有项目的编译环境均为 JDK1.8,千万不要拉的太高,不然直接编译错误恶心死你,实测 17 及以上 JDK 直接崩溃

新建空的 maven 项目

pom 添加 eureka 依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

配置入口文件

代码清单:EurekaApplication.java

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

编写配置文件(配置文件直接放到 resource 文件夹下面)

特别注意!!!配置项 defaultZone 必须是以小驼峰的形式书写,不能写成蛇形 default-zone 否则永远运行不了!!!

代码清单:application.yaml

# eureka服务器执行的端口
server:
  port: 10001

# spring名称
spring:
  application:
    name: eurekaserver

# 设置eureka服务器的可视化管理平台的默认URL
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10001/eureka

打开控制面板:http://localhost:10001/
即可看到下方的效果

在这里插入图片描述


设置 Eureka Client

随意选择一个 springboot 项目(版本 2.7.15 及以下)

pom 内添加 eureka-client 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

和设置 eureka-server 不同的是,我们无需再为入口文件顶部添加注解 @EnableEurekaClient,因为目前对于高版本 springboot 来说,eureka 已经自动帮我们完成了这一步骤,我们仅需设置配置文件就可以了!

配置文件设置好 spring 的名称,以及 eureka 配置即可

server:
  port: 10087

spring:
  application:
    name: userserver

eureka:
  client:
    # 同样的,这里指向的是我们eureka-server的地址!
    service-url:
      defaultZone: http://127.0.0.1:10001/eureka

此时先重新构建 eureka-server,然后再构建当前项目,打开控制面板,即可看见目前存在了两个 eureka-client


Eureka 服务发现

之前设置的远程服务调用 RestTemplate,是直接使用了硬编码,把 URL 写死了,现在我们配置好了 Eureka 服务器,那就可以使用负载均衡的原理,直接调用对应的后端服务器

打开 OrderApplication.java ,为对应的 RestTemplate 添加负载均衡注解

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

然后修改之前的硬编码为我们设置的服务提供者 user-server对应的 URL 即可

String url = "http://user-server/user/" + order.getUserId();

与此同时,这就完成了一个完整的 Eureka 工作流程

  1. user-server 发送服务到注册中心 eureka-server
  2. order-server 从注册中心发现服务,并取回使用

Ribbon

工作流程

在这里插入图片描述

在配置完毕 eureka 后,我们发现,虽然可以在代码中使用诸如 http://user-server/user/xxx 的形式来访问到对应的后端服务器,但是当我们直接把这段 URL 填入浏览器时,发现无法访问

而 Ribbon 的作用,简单来说,就是帮助我们把浏览器 URL 转义为对应的地址,让我们顺利访问到后端服务器(有点 DNS 那味了)

上图展示了 Ribbon 工作的基本流程

  1. 获取原始 URL,从中提取出 eureka-client 的 id
  2. 以此 id 请求 eureka-server,拿到所有相关的服务器原地址
  3. 借助 ribbon 负载均衡措施,选择一个地址并使用
  4. 转译该地址,返回

配置与使用 Ribbon

在这里插入图片描述

上图给出了可供选择的 Ribbon 负载均衡策略


Ribbon 自身通过接口 IRule 来自定义对应的负载均衡策略

OrderApplication.java 随便注入一个规则

@Bean
public IRule randomRule() {
    return new RandomRule();
}

定义负载均衡的方式也可以直接写在配置文件里面,这里不做演示,还是建议写在入口类,更加直观

入口类定义 IRule:全局作用;配置文件定义 IRule:局部作用


饥饿加载

ribbon 默认使用懒加载,所以当首次启用负载均衡时,会浪费很多时间实例化对象

在配置文件里面设置 ribbon 为饥饿式加载方法

ribbon:
  eager-load:
    # 当需要对多个eureka-client实现同类型加载方式的话,使用数组的写法
    clients:
      - user-server
      - order-server
    enabled: true

更多推荐

Java的checked exception有意义吗?

1前言这种异常必须在编译前就try/catch,又不一定会抛异常,小项目中不明显,大项目中,会造成不必要代码臃肿和可读性降低,完全可在编译出错时,通过单元测试和调试,得到正确代码。这设计还有啥意义?CheckedException初衷很好,但事实上是没啥卵用设计。2初衷很好因为我们都知软件会有各种问题,严谨处理这些问题

【JavaScript精通之道】掌握数据遍历:解锁现代化遍历方法,提升开发效率!

​🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!​目录📚前言📘1.reduce方法📘2.forEach方法📘3.map方法📘4.for循环📘5.filter方法📘6.for...of循环📘7.Object.keys方法📘8.Object.va

ARTS 打卡 第一周,初试ARTS

前言认识三掌柜的想必都知道,我持续创作技术博客已经有6年时间了,固定每个月发布不少于6篇博文。同时,自己作为一名热爱分享的开发者,像ARTS这样的活动自然少不了我。由于我是打算挤在一起分享,之前都是做了本地文档记录,所以直接把内容整合起来即可,那么接下来就开启我的第一周打卡咯。ARTS是什么?ARTS其实是由四个部分组

ngx_memalign是在 Nginx 中使用的一个内存分配函数,它的作用是根据指定的对齐方式和大小,分配一块对齐的内存

ngx_memalignngx_memalign是在Nginx中使用的一个内存分配函数。它的作用是根据指定的对齐方式和大小,分配一块对齐的内存。这个函数在Nginx的内存管理系统中使用得比较广泛,尤其是在处理大块数据时,可以提高内存访问的效率。具体的函数原型如下:void*ngx_memalign(size_talig

Apache Spark 的基本概念

ApacheSpark是一种快速、可扩展、通用的数据处理引擎。它是一种基于内存的计算框架,支持分布式数据处理、机器学习、图形计算等多种计算任务。与传统的HadoopMapReduce相比,Spark具有更高的性能和更广泛的应用场景。Spark中的基本概念包括:1.ResilientDistributedDatasets

Javas | DecimalFormat类、BigDecimal类、Random类

目录:1.DecimalFormat类2.BigDecimal类3.Random类4.需求:编写程序,生成5个不重复的随机数1.DecimalFormat类DecimalFormat是NumberFormat的一个具体子类,用于格式十进制数字。/***关于数字的格式化*/publicclassDecimalFormat

滚雪球学Java(28):轻松掌握数组:访问和遍历技巧

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!前言在Java编程中,数组是一种常用的数据结构。它在存储和处理数据时具有很高的效率,能够方便地进行访问和遍历。本文将介绍数组的访问和遍历技巧,帮助读者更加深入地了解Java数

单片机C语言实例:23、串口通讯

一、轮询发送程序实例1:#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include"delay.h"/*------------------------------------------------函数声明---------------------------

Vue记录(下篇)

Vuexgetters配置项*Count.vue<template><div><h1>当前求和为:{{$store.state.sum}}</h1><h3>当前求和的10倍为:{{$store.getters.bigSum}}</h3><selectv-model.number="n"><optionvalue="1"

vue+springboot,easyexcel的excel文件下载

文章目录1.效果展示1.1前端界面1.2下载的excel2.思路介绍3.前端代码展示4.后端代码展示5.核心代码解释1.效果展示excel文件单一sheet,多sheet导出本文主要介绍如何使用easyexcel,配合前端导出Excel文件。同时提供Excel的两种导出形式:单一sheet,多sheet。1.1前端界面

02-HTML常用标签

02-HTML常用标签2.1标签的构成标签由<、>、/、英文单词或字母组成。并且把标签中<>包括起来的英文单词或字母称为标签名常见标签由两部分组成,我们称之为:双标签。前部分叫开始标签,后部分叫结束标签,两部分之间包裹内容就是标签名。少数标签由一部分组成,我们称之为:单标签。自成一体,无法包裹内容(比如:<hr>、<b

热文推荐