IDEA 搭建 SpringCloud 项目【超详细步骤】

news/2025/2/7 4:34:02/

文章目录

    • 一、前言
    • 二、项目搭建
      • 1. 数据库准备
      • 2. 创建父工程
      • 3. 创建注册中心
      • 4. 服务注册
      • 5. 编写业务代码
      • 6. 服务拉取

一、前言

所谓微服务,就是要把整个业务模块拆分成多个各司其职的小模块,做到单一职责原则,不会重复开发相同的业务代码,实现真正意义上的高内聚、低耦合。同时,微服务可以对外暴露接口,供其它微服务使用。

如果我们在 A 服务中发起一个 http 请求到 B 服务,那么就可以实现微服务的远程调用。(restTemplate 的 getForObject 方法可以向浏览器发起请求)
这种方法看起来是可行的,但是把 url 路径和 Java 代码耦合到一起,是不符合开闭原则的。于是就出现了 Eureka 注册中心。

每一个微服务在启动的那一刻都需要做一件事情,就是把自己的服务信息注册给 Eureka,比如服务名称、服务端口等,其它微服务想要调用另一个服务的时候,直接去 Eureka 里面拉取信息就可以了。
同时,为了避免拉取的服务已经挂掉了,我们的服务每隔 30 秒就会向 Eureka 发起一次心跳,来证明自己还活着,如果有一天不跳了,Eureka 就会把它从注册列表中剔除。

如果存在多个服务提供者,服务消费者就会利用负载均衡算法,从服务列表中挑选一个!

二、项目搭建

1. 数据库准备

此处我们要准备两个数据库,user 服务和 order 服务各自拥有自己的数据库。

CREATE TABLE USER (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
phone VARCHAR(15) NOT NULL,
address VARCHAR(50) NOT NULL
);INSERT INTO USER VALUES (1, "栈老师不回家", 13299075426, "山西省大同市")
INSERT INTO USER(NAME, phone, address) VALUES ("肖恩", 18834267011, "山西省太原市")
INSERT INTO USER(NAME, phone, address) VALUES ("李华", 12481076533, "山西省运城市")

在这里插入图片描述

CREATE TABLE orders (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30) NOT NULL,
price INT NOT NULL,
user_id INT NOT NULL REFERENCES USER(id)
)INSERT INTO orders VALUES (1, "可乐鸡翅", 32, 1);
INSERT INTO orders(NAME, price, user_id) VALUES("冰镇啤酒", 12, 1);
INSERT INTO orders(NAME, price, user_id) VALUES("草莓冰激凌", 8, 2);
INSERT INTO orders(NAME, price, user_id) VALUES("狼牙土豆", 10, 3);

在这里插入图片描述

2. 创建父工程

① 还是 SpringBoot 项目,选择 Spring Web 依赖

在这里插入图片描述

在这里插入图片描述

② 删掉 src 目录及 mvnw 开头的两个文件

在这里插入图片描述

③ 在 pom 文件中添加 packaging 标签和 SpringCloud 版本,并修改 SpringBoot 版本

在这里插入图片描述

④ 引入 mysql 和 mybatis 依赖,供后续使用

在这里插入图片描述

⑤ 添加 SpringCloud 依赖库,后续子模块使用的时候就不需要再指定版本了

在这里插入图片描述

3. 创建注册中心

① 在父级项目上新建模块

在这里插入图片描述

② 选择 Eureka Server

在这里插入图片描述

③ 修改子模块的 parent 标签内容,指向父工程

在这里插入图片描述

因为父模块中已经指定了 SpringCloud 的版本,所以子模块不需要再重复写!

④ 在父级 pom 中添加该子模块

在这里插入图片描述

⑤ 因为子类会继承父类的依赖,所以子类中多余的依赖可以删掉,后续需要什么加什么

在这里插入图片描述

⑤ 编写 application.yml 文件

#服务端口,随便起
server:port: 11011
#服务名称
spring:application:name: eurekaserverdatasource:url: jdbc:mysql:///ZXEdb?serverTimezone=UTCusername: rootpassword: 856724bbdriver-class-name: com.mysql.cj.jdbc.Driver#eureka地址
eureka:client:service-url:defaultZone: http://127.0.0.1:11011/eureka/register-with-eureka: falsefetch-registry: false

在这里插入图片描述

服务名称和 eureka 地址的配置我们可以认为是服务注册的配置,而 eureka 自己也是一个微服务,所以在服务启动的时候,它也会把自己注册到 eureka 上!

⑥ 启动类上添加 @EnableEurekaServer 注解

在这里插入图片描述

⑦ 输入 http://localhost:11011/,出现以下界面即 Eureka 创建成功。

在这里插入图片描述

4. 服务注册

情形:
创建一个 order 服务和一个 user 服务,并把它们都注册到 eureka 中。order 里面需要用到 user,所以此时的 order 是消费者,user 是提供者。

对于服务的注册,我们只需要完成两步:
① 引入 spring-cloud-starter-netflix-eureka-client 依赖;
② 在 yml 文件中配置服务名称和 eureka 地址。

eureka 服务的依赖是 server,其余微服务都是 client!

① 创建 order 服务和 user 服务

在这里插入图片描述

② 引入 eureka 客户端依赖

在这里插入图片描述

在这里插入图片描述

③ 在父级 pom 中添加该子模块

在这里插入图片描述

④ 编写 yml 配置文件

#服务端口,随便起
server:port: 8081
#服务名称
spring:application:name: userserverdatasource:url: jdbc:mysql:///user?serverTimezone=UTCusername: rootpassword: 856724bbdriver-class-name: com.mysql.cj.jdbc.Driver#eureka地址
eureka:client:service-url:defaultZone: http://127.0.0.1:11011/eureka/

在这里插入图片描述

④ 启动类上添加 @EnableEurekaServer 注解

在这里插入图片描述

以上是 user 的注册,order 同理!

在这里插入图片描述

5. 编写业务代码

要求查询订单表,其中订单表里面包含用户信息。

① 实体类

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

② 配置文件中添加驼峰命名功能及实体映射

#开启驼峰命名及实体映射
mybatis:type-aliases-package: com.zxe.orderserver.pojoconfiguration:map-underscore-to-camel-case: true

③ 编写数据层、业务层及控制层的代码

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6. 服务拉取

服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡。

① 在 order-service 的启动类中注册 RestTemplate

在这里插入图片描述

@LoadBalanced 注解用来做负载均衡!

② 编写 OrderService 代码,order 要调用 user,自然要用到 user 接口的访问路径,此处的路径中我们用服务名来代替 localhost

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order findById(Integer id) {Order order = orderMapper.find(id);String url = "http://userserver/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);order.setUser(user);return order;}
}

③ 运行结果

在这里插入图片描述


http://www.ppmy.cn/news/1236351.html

相关文章

C++语法知识点-vector+子数组

C语法知识点-vector子数组 一维数组定义无参数有参数迭代器扩容操作reserve 二维数组 vector 定义创建m*n的二维vectorvector< vector<int> > v(m, vector<int>(n) ) 初始化定义vector常用函数的实例分析访问操作resize 函数push _back ( )pop_back()函数siz…

【黑马甄选离线数仓day01_项目介绍与环境准备】

1. 行业背景 1.1 电商发展历史 电商1.0: 初创阶段20世纪90年代&#xff0c;电商行业刚刚兴起&#xff0c;主要以B2C模式为主&#xff0c;如亚马逊、eBay等 ​ 电商2.0: 发展阶段21世纪初&#xff0c;电商行业进入了快速发展阶段&#xff0c;出现了淘宝、京东等大型电商平台&a…

Linux下载工具XDM下载安装与使用

Windows上IDM多线程下载非常强大&#xff0c;即能捕捉页面上的视频、图片、音频&#xff0c;又能作为浏览器下载器使用&#xff0c;但是IDM无法在Linux下使用&#xff0c;除非使用wine。不过我们可以在Linux中用XDM(Xtreme Download Manager)代替IDM。 1、XDM下载 Xtreme Dow…

【Java 进阶篇】Redis:打开缓存之门

介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的键值对存储系统&#xff0c;被广泛用作缓存、消息中间件和数据库。它以其快速的读写能力、支持多种数据结构和丰富的功能而闻名。在这篇博客中&#xff0c;我们将深入了解Redis的概念、安装以及基本…

Android 匿名内存深入分析

Android 匿名内存解析 有了binder机制为什么还需要匿名内存来实现IPC呢&#xff1f;我觉得很大的原因就是binder传输是有大小限制的&#xff0c;不说应用层的限制。在驱动中binder的传输大小被限制在了4M&#xff0c;分享一张图片可能就超过了这个限制。匿名内存的主要解决思路…

WSL登录时提示nsenter: cannot open /proc/320/ns/time: No such file or directory的解决办法

在登录 WSL 的 Ubuntu 时&#xff0c;不仅要求 root 权限&#xff0c;还登录失败&#xff0c;提示“nsenter: cannot open /proc/320/ns/time: No such file or directory”。 解决办法是在 powershell 中执行 “wsl – sudo vi /etc/profile”命令&#xff0c;删除文件内容&a…

MySQL数据库_01

Web后端开发_02 数据库介绍 什么是数据库&#xff1f; 数据库&#xff1a;DataBase&#xff08;DB&#xff09;&#xff0c;是存储和管理数据的仓库 数据库管理系统&#xff1a;DataBase Management System (DBMS)&#xff0c;操纵和管理数据库的大型软件。SQL&#xff1a;St…

HCIP---MPLS---LDP

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 MPLS 基于标签转发表进行转发&#xff0c;与路由表类似&#xff0c;标签转发表有两种获取渠道&#xff1a;一是手动配置(类似静态路由)&#xff0c;二是通过协议自动学习(类似OSPF)。手动配…