SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(Eureka、Ribbon)

news2025/1/17 21:57:47

微服务技术栈导学

微服务技术是分布式架构(把服务做拆分)的一种

而springcloud仅仅是解决了拆分时的微服务治理的问题,其他更复杂的问题并没有给出解决方案

一个完整的微服务技术要包含的不仅仅是springcloud

微服务技术栈

包括什么
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

认识微服务

(一)服务架构演变

1、单体架构

在这里插入图片描述

2、分布式架构

在这里插入图片描述

3、服务治理

在拆分的过程中也会有一些问题
在这里插入图片描述

4、微服务

在这里插入图片描述

5、总结

在这里插入图片描述

(二)微服务技术对比

1、微服务结构

在这里插入图片描述

2、微服务技术对比

在这里插入图片描述
SpringCloudAlibaba兼容了前面两种

3、企业需求

在这里插入图片描述

(三)SpringCloud

在这里插入图片描述
在这里插入图片描述

服务拆分

(一)案例Demo

1、服务拆分注意事项

在这里插入图片描述

2、导入服务拆分Demo

在这里插入图片描述
在这里插入图片描述
order表user_id虽然和user表进行关联,但是因为是跨database的,因此无法进行关联查询

在这里插入图片描述
项目中所有的微服务:
在这里插入图片描述
以下是两个分别的application.yml

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
    username: root
    password: root123456
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password: root123456
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS

将两个都启动:
在这里插入图片描述
在浏览器中(下载Chrome插件Json Viewer)
在这里插入图片描述
在这里插入图片描述

(二)服务远程调用

1、根据订单id查询订单功能

在这里插入图片描述

2、远程调用方式分析

那么问题就转变成了:如何在java代码中(像浏览器一样)发起http请求,这样就能实现远程调用了
在这里插入图片描述
Spring提供了一个工具——RestTemplate,用来发http请求
在这里插入图片描述

通过Bean的方式把RestTemplate注册为其中的一个对象,然后将来可以在任何地方注入这个对象来使用

写在哪里呢?Bean的注入只能放在配置类中,而启动类(OrderApplication)(带有@SpringBootApplication)本身也是配置类,所以完全可以在这里写Bean的注入

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

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

    /**
     * 创建RestTemplate并注入Spring容器
     * @return
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

接下来就可以利用它来发http请求了
在这里插入图片描述

修改OrderService

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    
    // 0.注入RestTemplate
    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate发送http请求,查询用户
        // 2.1.url路径
        String url = "http://localhost:8081/user/" + order.getUserId();
        // 2.2.发送http请求,实现远程调用(getForObject默认返回json,加上User.class参数g告诉它返回值的类型,自动转化成User对象)
        User user = restTemplate.getForObject(url, User.class);
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

然后重启Order服务(User服务就不需要重启了)
在这里插入图片描述

3、总结

在这里插入图片描述

Eureka注册中心

(一)提供者与消费者

在这里插入图片描述

(二)eureka原理分析

1、服务调用出现的问题

在这里插入图片描述

刚才将user-service服务的ip和端口硬编码在代码中的,有一定问题
所以不能用硬编码方式

在这里插入图片描述

2、Eureka的作用

在这里插入图片描述

每一个服务启动时都会把自己的信息注册给eureka

如果某个心脏不跳动了,eureka会将这个从列表中删除
在这里插入图片描述

3、总结

在这里插入图片描述

(三)搭建eureka服务

1、动手实践

在这里插入图片描述

2、搭建EurekaServer

在这里插入图片描述

搭建EurekaServer需要创建一个独立的微服务

starter是springboot中的自动装配,也就是说在这个依赖中已经帮我们把springeureka的所有的配置都做好了,也就是说我们可以零配置直接拿来用了

当然,自动装配是需要有开关的,第二步这个注解就是eurekaserver自动装配的开关

第三步需要编写一些配置信息,端口信息、服务名称、eureka的地址信息

接下来开始写:
1、创建一个新的module
在这里插入图片描述
引入依赖:

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

注意到我们引入的时候并没有指定版本信息,以前学习springboot时也遇到过这种情况,原因是在我们的父工程中,已经把依赖的版本都管理好了,所以可以进入cloud-demo的父工程的pom文件看,可以看到spring-boot-starter-parent的版本为2.3.9.RELEASE,以及spring-cloud版本和其他,并且有spring-cloud-dependencies依赖库,里面有大量的springcloud的组件及其版本信息,全都定义好了,所以在我们引入springcloud组件时,我们无需指定任何版本信息

2、编写main函数并添加注解
新建cn.itcast.eureka.EurekaApplication类

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

3、编写一个配置文件
resources下新建application.yml

server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称
eureka:
  client:
    service-url: # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

注意由于eureka自己也是一个微服务,会将自己也注册到eureka上(这是为了将来eureka集群去用的),所以它也需要一个名字,而且还需要再配一个eureka的地址eureka.client.service-url

也就是说“这里是为了做服务注册才配置这些信息”

然后点击EurekaApplication左边的三角形启动,就可以在下面的服务中看到多出来了EurekaApplication
在这里插入图片描述
点击这个蓝色的端口号,会自动跳转到浏览器

点击10086,就跳转到了eureka的管理界面
在这里插入图片描述

status中的up表示正常状态,down表示挂掉了,up后面的是ip

(四)服务注册

1、注册user-service

在这里插入图片描述
可以看到,除了依赖不一样(刚才时eureka的服务端,现在是eureka的客户端),这个配置和刚才在eureka中做的配置文件长得非常像。为什么?因为eureka启动时会把自己注册到eureka,所以它也需要配服务名称和地址。所以服务名称和地址的配置实际上是服务注册的配置,只要配了它,就可以做注册

<!--eureka客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

然后配置yml文件

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password: root123456
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: userservice # user服务的服务名称
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
eureka:
  client:
    service-url: # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

然后重启UserApplication

接下来把Order服务也注册到Eureka,同上,然后重启
在这里插入图片描述
这里每个服务都只有一个实例,我们可以每个服务启动多个实例

在这里插入图片描述
在这里插入图片描述
(在这里配置端口,是为了覆盖yml文件的端口的)在这里插入图片描述
然后把它也启动,
在这里插入图片描述

(五)服务发现

我们希望orderservice可以基于服务名称拉取到userservice的两个实例信息,然后实现负载均衡
在这里插入图片描述
用服务名称代替ip、端口:在eureka中可以看到userservice这个服务名代指的就是这两个端口

要在多个实例中负载均衡,要给之前用到的RestTemplate这个Bean加一个注解@LoadBalanced

都弄完之后,我们把两个UserApplication的都清空,因为我们想知道OrderApplication究竟使用的是哪一个UserApplication,因为在OrderService中url中只是userservice,没有加任何ip地址

(六)总结

在这里插入图片描述

Ribbon负载均衡

(一)负载均衡原理

在这里插入图片描述
直接在浏览器中访问userservice/user/1是无法访问的

在这里插入图片描述

(二)负载均衡策略

IRule接口决定了负载均衡的策略
在这里插入图片描述
在这里插入图片描述
ZoneAvoidanceRule是默认

在这里插入图片描述
注意第一种代码方式是全局的,也就是说我一旦配了上面这种方案,在orderservice中不管你是调用哪一个微服务,都是randomrule;而第二种配置文件方式会先指定服务名称,再指定负载均衡的规则,只针对某个服务而言。

(三)饥饿加载

重启OrderApplication,
在这里插入图片描述
达到了非常恐怖的311毫秒,然后再刷新一次,
在这里插入图片描述
时长就只有19毫秒了

在这里插入图片描述

创建LoadBalanceClient的过程中还要做服务的拉取,因此时间长

(这个配置是在orderservice的application.yml文件)

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
    username: root
    password: root123456
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: orderservice # order服务的服务名称
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
eureka:
  client:
    service-url: # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka
userservice:
  ribbon:
    NFLoadBalanceRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
ribbon:
  eager-load: 
    enabled: true # 开启饥饿加载
    clients: # 指定饥饿加载的服务名称
      - userservice
      - xxservice

这个ribbon与上面userservice下的ribbon不冲突

(四)总结

在这里插入图片描述

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

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

相关文章

什么是远程办公,如何挑选远程办公软件

远程办公已经不再是新型工作模式&#xff0c;随着科技的发展和全球化的趋势&#xff0c;越来越多的企业和个人已经开始接受这种新型的工作模式。远程办公可以让员工在家里或者任何地方工作&#xff0c;不用去公司办公室&#xff0c;大大提高了员工的工作效率和生活质量。本文将…

hdfs命令行操作

文章目录1. 对文件夹进行操作1.1 ls:对路径进行访问1.2 mkdir:对路径进行创建1.3 rm:对路径进行删除2.对文件进行操作2.1在文件系统中创建空文件2.2上传本地文件到hdfs上2.3 从hdfs上下载文件到本地路径2.4 查看hdfs 上的文件内容2.5 对hdfs上的文件进行复制2.6 追加本地文件内…

微服务·入门·贰——注册中心nacos、eureka

文章目录1. 微服务问题解决服务治理问题1.1 问题抛出1.2 解决方法2 Eureka注册中心2.1 Eureka解决的问题2.2 Eureka的结构和作用2.2.1 Eureka的作用2.2.2 order-service如何得知user-service实例地址 &#xff1f;2.2.3 order-service如何从多个user-service实例中选择具体实例…

家政服务小程序实战开发教程019-我的预约功能(已完结)

我们上一篇讲解了用户注册的功能&#xff0c;注册完毕后页面需要显示用户的头像和昵称&#xff0c;并显示我的预约的菜单&#xff0c;本篇我们介绍一下如何开发。 1 显示用户头像和昵称 在未注册时我们显示了一个默认的头像&#xff0c;已注册需要显示用户的头像。思路是将未…

【零基础入门 Nginx】——万字文章通俗易懂

一、Nginx 简介 1️⃣ Nginx 概述 Nginx&#xff08;Engine X&#xff09; 是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强。同时也提供了IMAP/POP3/SMTP服务 nginx可以作为静态页面的web服务器&#xff0c;同时还支持CGI协议的动态…

WebRTC 系列(二、本地通话,H5、Android、iOS)

WebRTC 系列&#xff08;一、简介&#xff09;​​​​​​​ 一、整体流程 有了上一篇 WebRTC 简介的基础&#xff0c;我们知道了 WebRTC 的工作流程&#xff0c;接下来就是需要用代码去实现这个流程了。对于不同端&#xff0c;实现起来的难易程度可能略微不同&#xff08;实…

RHCE第二次作业ssh远程连接和NTP时间服务器

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 在服务器准备工作查看服务是否开启&#xff0c;查看是否运行 同步时间&#xff0c;编辑/etc/chrony.conf,层级优先级10&#xff0c;在允许客户机。 暂时关闭防火墙&#xff0c;关闭服务后&#xff0c;重启…

vue3-element-plus表单校验和多选表格table的基本使用

表单校验 <script setup> import { ref } from "vue"; // 登录的表单数据(绑定到最外层的from标签上) //里面的每个属性都与element-plus的表单标签进行双向绑定,具体可以看html代码 const loginForm ref({username: "",password: "",lo…

双向可控硅详细用法说明

可控硅作为功率开关器件&#xff0c;在各种需要控制功率的电子产品中经常用到&#xff0c;我所涉及的行业为家电产品研发&#xff0c;比如发热丝、发热管的控温&#xff0c;或者AC电机、水泵的控速等&#xff1b;由于双向可控硅是在单向可控硅的基础上发展而来且应用场景更广&a…

ucgui的触摸执行过程

在STM32上调试ucosucguI的触摸时&#xff0c;显示上下左右中5个button&#xff0c;但是按上button时触发的却是右button&#xff0c;调试发现显示区域大小正常&#xff0c;触摸区域大小正常。但就是触摸区域无法与实际的button相对应。 分析原因可能是xy轴不匹配&#xff0c;那…

手撕深度学习中的优化器

深度学习中的优化算法采用的原理是梯度下降法&#xff0c;选取适当的初值params&#xff0c;不断迭代&#xff0c;进行目标函数的极小化&#xff0c;直到收敛。由于负梯度方向时使函数值下降最快的方向&#xff0c;在迭代的每一步&#xff0c;以负梯度方向更新params的值&#…

web前端笔记

HTML(安装live server插件) 我们上网时所看到的所有内容其实就是body里面的内容&#xff01; &#xff01; tab 快速生成一个html模板&#xff1b; https://www.runoob.com/tags/html-elementsdoctypes.html html的菜鸟教程&#xff01; html中的元素分为两种&#xff0c;一种…

广州蓝景分享—13个Web开发人员都知道的基本JavaScript函数

各位编程爱好者&#xff0c;今天由小蓝与大家分享13个基本的JavaScript 函数&#xff0c;如果您是 Web前端开发人员&#xff0c;您应该熟悉这些函数。 您可以将本文所有 JavaScript 函数加入收藏至您的工具箱&#xff0c;以便在您的软件项目中尽可能使用这些片段。 1. 检索任…

恐怖的低代码平台,我 All in 了!

本文目录一、低代码平台是什么&#xff1f;二、目前低代码产品平台是如何分类的&#xff1f;三、低代码平台是怎么互相比较的&#xff1f;一个比喻就明白了&#xff01;四、iVX平台的恐怖优势&#xff01;我 All in 了&#xff01;五、iVX的学习成本&#xff1f;总结&#xff1…

百度CTO王海峰做客《中国经济大讲堂》:文心一言,读书破万亿

当下&#xff0c;大语言模型热度空前&#xff0c;诸如文心一言、ChatGPT 等已经能够与人对话互动、回答问题、协助创作&#xff0c;逐渐应用于人们的工作和生活&#xff0c;也引发了社会热议。近日&#xff0c;百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰再…

asp.net Core 6 从空建立一个MVC项目,Razor组件使用

Razor组件使用MVC项目创建创建空的Web项目添加MVC框架Razor组件使用准备封装Razor组件MVC项目创建 创建一个空的项目&#xff0c;然后添加MVC。 创建空的Web项目 添加MVC框架 1.添加文件夹 2.添加控制器 3.添加界面 4.修改program.cs文件内容 //原生的 //var builder …

python入门:cl.exe‘ failed with exit status 2错误通用解决方案

文章目录 错误一错误二pypi.org独立安装正确安装错误一 error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ 这个错误在windows系统上安装python工…

用64位的plsql developer 连接虚拟机中的64位oracle数据库

背景&#xff1a;为了学习oracle&#xff0c;我在虚拟机上安装了oracle。并在实体机上安装了oracle客户端及plsql developer。 开始之前&#xff0c;先回答两个问题 为什么不在本机安装oracle? 因为oracle比较消耗资源&#xff0c;而我不会一直用&#xff0c;所以放到虚拟机里…

使用VMware虚拟机创建Ubuntu的linux系统,用Xshell连接这个系统,VScode作为编辑器时遇到的问题

使用VMware虚拟机创建Ubuntu的linux系统&#xff0c;用Xshell连接这个系统&#xff0c;VScode作为编辑器时遇到的问题1.软件2.Xshell和Xftp软件的使用3.VScode中安装了Remote Development扩展之后&#xff0c;点击远程资源管理器&#xff0c;下拉框里没有SSH-Targets4.将VScode…

Coremail AI技术发展前生今世

2023年3月15日凌晨&#xff0c;OpenAI发布大型多模态模型GPT-4&#xff0c;正式宣告AI迈入新的“黄金时代”。作为邮件安全厂商&#xff0c;Coremail不禁思索&#xff0c;在当今科技高速发展的节点上&#xff0c;如何将此类大型多模态模型落地至具体的邮件安全防护&#xff1f;…