服务消费微服务

news/2024/4/28 7:03:09/文章来源:https://blog.csdn.net/m0_64637029/article/details/136996893

文章目录

    • 1.示意图
    • 2.环境搭建
        • 1.创建会员消费微服务模块
        • 2.删除不必要的两个文件
        • 3.检查父子模块的pom.xml文件
          • 1.子模块
          • 2.父模块
        • 4.pom.xml 添加依赖(刷新)
        • 5.application.yml 配置监听端口和服务名
        • 6.com/sun/springcloud/MemberConsumerApplication.java 创建启动类测试
        • 7.测试执行
          • 1.发现80端口被占用
          • 2.打开命令行输入 netstat -anb 查看是谁占用了80端口
          • 3.只能更换端口,使用 netstat -aon | findstr :81 来查看81端口被没被占用
          • 4.application.yml 更换端口和名字为81
          • 5.再次测试运行,成功在81端口监听
          • 6.浏览器请求测试
          • 7.更换项目名称为81(这样直接就知道这个服务在81端口监听)
        • 8.细节说明
          • 1.如果报错说数据库有问题,可能就是在pom.xml中保留了mybatis的依赖
          • 2.解决方案:启动类排除数据源自动配置
    • 3.代码实现
        • 1.com/sun/springcloud/entity/Member.java 创建entity与会员中心模块保持一致
        • 2.com/sun/springcloud/util/Result.java 创建Result工具类
        • 3.RestTemplate 基本介绍
        • 4.com/sun/springcloud/config/CustomizationBean.java 配置类注入RestTemplate的bean对象
        • 5.com/sun/springcloud/controller/MemberConsumerController.java 作为会员中心微服务 save接口的中转站
        • 6.启动两个微服务进行测试
          • 1.首先启动会员中心微服务
          • 2.启动服务消费微服务
          • 3.postman测试
          • 4.数据库信息
        • 7.注意事项
          • 1.RestTemplate发送请求的细节
          • 2.entity实体类需要实现Serializable接口实现可序列化
          • 3.在这个案例中
        • 8.com/sun/springcloud/controller/MemberConsumerController.java 新增方法
        • 9.postman测试
        • 10.注意事项和细节
          • 1.开启Run Dashboard/Service
            • 1.打开 .idea/workspace.xml
            • 2.粘贴配置代码到这里
            • 3.配置代码
            • 4.重启项目
            • 5.查看Services
            • 6.可以在这启动项目
            • 7.启动之后的效果
          • 2.关于微服务的细节
            • 1.对微服务的理解
            • 2.每个微服务接口的组成
    • 4.创建一个共用模块
        • 1.创建公共模块 e_commerce_center-common-api
        • 2.检查父子的pom.xml
          • 1.子pom.xml
          • 2.父pom.xml
        • 3.pom.xml 引入依赖(刷新)
        • 4.抽取共用api
        • 5.maven打成jar包
        • 6.target目录生成jar包
        • 7.package和install的区别(部署项目的时候打包使用package)
        • 8.工程重构
          • 1.删除两个模块的Member和Result类,此时会报错
          • 2.两个模块的pom.xml都引入刚才的jar包
            • 1.查找公共模块jar包的坐标
            • 2.pom.xml分别引入jar包
          • 3.重启两个模块进行测试
            • 1.重启
            • 2.测试

1.示意图

image-20240324133630813

2.环境搭建

1.创建会员消费微服务模块

image-20240324134326276

2.删除不必要的两个文件

image-20240324134540398

3.检查父子模块的pom.xml文件
1.子模块

image-20240324134701444

2.父模块

image-20240324134801985

4.pom.xml 添加依赖(刷新)
    <dependencies><!-- springboot web starter 用来监听端口--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 如果在子工程/模块指定了 version,则以指定为准 --></dependency><!--1. starter-actuator 是 springboot 程序的监控系统,可以实现健康检查,info 信息等2. 访问 http://localhost:10000/actuator 可以看到相关链接, 还可以做相关设置. --><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
5.application.yml 配置监听端口和服务名
server:port: 80 # 监听80端口
spring:application:name: member-service-consumer-80
6.com/sun/springcloud/MemberConsumerApplication.java 创建启动类测试
package com.sun.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** Description:** @Author sun* @Create 2024/3/24 13:58* @Version 1.0*/
@SpringBootApplication
public class MemberConsumerApplication {public static void main(String[] args) {SpringApplication.run(MemberConsumerApplication.class, args);}
}
7.测试执行
1.发现80端口被占用

image-20240324140518987

2.打开命令行输入 netstat -anb 查看是谁占用了80端口

image-20240324140627236

3.只能更换端口,使用 netstat -aon | findstr :81 来查看81端口被没被占用
  • 没有响应,说明没有被占用

image-20240324140844982

4.application.yml 更换端口和名字为81
server:port: 81 # 监听81端口
spring:application:name: member-service-consumer-81
5.再次测试运行,成功在81端口监听

image-20240324141100526

6.浏览器请求测试

image-20240324141452102

7.更换项目名称为81(这样直接就知道这个服务在81端口监听)

image-20240324141248037

8.细节说明
1.如果报错说数据库有问题,可能就是在pom.xml中保留了mybatis的依赖

image-20240324141547734

2.解决方案:启动类排除数据源自动配置

image-20240324141703928

3.代码实现

1.com/sun/springcloud/entity/Member.java 创建entity与会员中心模块保持一致
  • 因为需要使用这个实体类来接收信息,然后调用会员中心模块
package com.sun.springcloud.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** Description:** @Author sun* @Create 2024/3/24 14:21* @Version 1.0*/
@AllArgsConstructor
@NoArgsConstructor
@Data
//Serializable 加上,后面可能使用
public class Member implements Serializable {private Long id;private String name;private String pwd;private String mobile;private String email;private Integer gender;
}
2.com/sun/springcloud/util/Result.java 创建Result工具类
package com.sun.springcloud.util;/*** Description:** @Author sun* @Create 2024/3/24 14:21* @Version 1.0*/
public class Result<T> {private String code;private String msg;private T data;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}public Result() {}public Result(T data) {this.data = data;}public static Result success() {Result result = new Result<>();result.setCode("200");result.setMsg("success");return result;}public static <T> Result<T> success(T data) {Result<T> result = new Result<>(data);result.setCode("200");result.setMsg("success");return result;}public static <T> Result<T> success(String msg, T data) {Result<T> result = new Result<>(data);result.setCode("200");result.setMsg(msg);return result;}public static Result error(String code, String msg) {Result result = new Result();result.setCode(code);result.setMsg(msg);return result;}public static <T> Result<T> error(String code, String msg, T data) {Result<T> result = new Result<>(data);result.setCode(code);result.setMsg(msg);return result;}}
3.RestTemplate 基本介绍

image-20240324142920033

4.com/sun/springcloud/config/CustomizationBean.java 配置类注入RestTemplate的bean对象
package com.sun.springcloud.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** Description: 配置类** @Author sun* @Create 2024/3/24 14:32* @Version 1.0*/
@Configuration
public class CustomizationBean {/*** 注入RestTemplate的bean对象* @return*/@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
5.com/sun/springcloud/controller/MemberConsumerController.java 作为会员中心微服务 save接口的中转站
package com.sun.springcloud.controller;import com.sun.springcloud.entity.Member;
import com.sun.springcloud.util.Result;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;/*** Description: 作为会员中心微服务对member表操作的网关** @Author sun* @Create 2024/3/24 14:42* @Version 1.0*/
@RestController
public class MemberConsumerController {/*访问会员中心微服务的前缀*/public static final String MEMBER_SERVICE_PROVIDER_URL = "http://localhost:10001";/*注入微服务之间通讯的RestTemplate的bean对象*/@Resourceprivate RestTemplate restTemplate;/*** 向会员中心微服务的save接口发送请求,携带member对象,接受返回的结果Result并以json的格式返回给浏览器** @param member 这里的参数必须是表单类型的,因为没有加@requestBody* @return*/@PostMapping("/member/consumer/save")public Result save(Member member) {// 注意:使用restTemplate发送请求时会将member转化为json格式的数据然后再发送请求,所以会员中心微服务的save接口必须加@requestBody注解return restTemplate.postForObject(MEMBER_SERVICE_PROVIDER_URL + "/member/save", member, Result.class);}}
6.启动两个微服务进行测试
1.首先启动会员中心微服务

image-20240324151439122

2.启动服务消费微服务

image-20240324151459426

3.postman测试

image-20240324151540004

4.数据库信息

image-20240324151621298

7.注意事项
1.RestTemplate发送请求的细节
  • 通过RestTemplate发送请求携带的参数会自动转换为json格式的数据
  • 所以在接受RestTemplate的参数中必须要加@RequestBody注解
2.entity实体类需要实现Serializable接口实现可序列化
  • 原因是使用RestTemplate传递参数时可能需要序列化
3.在这个案例中
  • 参数并没有@RequestBody注解,所以需要通过表单传入数据
8.com/sun/springcloud/controller/MemberConsumerController.java 新增方法
    /*** 接受id为路径参数,向会员中心微服务模块的getMemberById接口发送请求,根据id获取信息** @param id 请求参数* @return 根据id返回json类型的数据*/@GetMapping("/member/consumer/get/{id}") // 这里使用的路径参数public Result getMemberById(@PathVariable("id") Long id) {return restTemplate.getForObject(MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id, Result.class);}
9.postman测试

image-20240324154022333

10.注意事项和细节
1.开启Run Dashboard/Service
1.打开 .idea/workspace.xml

image-20240324155027471

2.粘贴配置代码到这里

image-20240324154605286

3.配置代码
  <component name="RunDashboard"><option name="configurationTypes"><set><option value="SpringBootApplicationConfigurationType" /></set></option><option name="ruleStates"><list><RuleState><option name="name" value="ConfigurationTypeDashboardGroupingRule" /></RuleState><RuleState><option name="name" value="StatusDashboardGroupingRule" /></RuleState></list></option></component>
4.重启项目

image-20240324155836039

5.查看Services

image-20240324155755823

6.可以在这启动项目

image-20240324155907673

7.启动之后的效果

image-20240324160051989

2.关于微服务的细节
1.对微服务的理解
  • 一个ip+端口就是一个微服务
  • 访问微服务的方式是ip + 端口 + 上下文路径(可以是根目录)+ 资源路径
2.每个微服务接口的组成
  • url
  • 请求方式
  • 参数
  • 返回值

4.创建一个共用模块

1.创建公共模块 e_commerce_center-common-api

image-20240324161231001

2.检查父子的pom.xml
1.子pom.xml

image-20240324161437500

2.父pom.xml

image-20240324161915002

3.pom.xml 引入依赖(刷新)
    <dependencies><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><!-- optional为true表示两个模块之间依赖不传递,也就是其他模块引入这个共用模块时,不传递这个模块的lombok依赖 --><optional>true</optional></dependency></dependencies>
4.抽取共用api

image-20240324163036287

5.maven打成jar包

image-20240324163510145

6.target目录生成jar包

image-20240324163408187

7.package和install的区别(部署项目的时候打包使用package)
  • package命令主要用于项目的编译和打包,但不会将产物安装到本地仓库,主要用于构建过程的测试和验证。
  • install命令在执行package的基础上,进一步将打包后的文件安装到本地Maven仓库,便于其他项目的依赖引用。
8.工程重构
1.删除两个模块的Member和Result类,此时会报错

image-20240324164248778

2.两个模块的pom.xml都引入刚才的jar包
1.查找公共模块jar包的坐标

image-20240324164407792

2.pom.xml分别引入jar包
        <!-- 公共模块的jar包 --><dependency><groupId>org.example</groupId><artifactId>e_commerce_center-common-api</artifactId><version>1.0-SNAPSHOT</version></dependency>
3.重启两个模块进行测试
1.重启

image-20240324165126302

2.测试

image-20240324165146951

image-20240324165306040

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

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

相关文章

社交革命:Facebook如何塑造数字社交的未来

引言 在当今数字化时代&#xff0c;社交媒体已成为人们生活的核心&#xff0c;而Facebook作为其中的领军者&#xff0c;一直在塑造着数字社交的未来。本文将深入探讨Facebook在数字社交领域的地位、影响力以及对未来社交的塑造作用&#xff0c;为读者揭示这场社交革命如何由Fa…

【MySQL】聊聊自增id用完怎么办?

在实际的开发中&#xff0c;一般都会将数据存储到数据库中&#xff0c;在设计表的时候&#xff0c;其实id如果达到最大值的话&#xff0c;会出现什么问题。其实主要分两种情况&#xff0c;一种是设置了主键id&#xff0c;另一种没有设置主键id。 表定义自增值id create table…

【Java程序设计】【C00389】基于(JavaWeb)Springboot的校园疫情防控系统(有论文)

基于&#xff08;JavaWeb&#xff09;Springboot的校园疫情防控系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过…

​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结

接上次博客&#xff1a;Redis&#xff08;四&#xff09;&#xff1a;持久化和事务&#xff1a;RDB&#xff08;定期备份&#xff09;【触发机制、流程说明、文件的处理、优缺点】、AOF&#xff08;实时备份&#xff09;【使用AOF、命令写入、文件同步、重写机制、启动时数据恢…

鸿蒙HarmonyOS应用开发之创建NDK工程

下面通过DevEco Studio的NDK工程模板&#xff0c;来演示如何创建一个NDK工程。 说明&#xff1a; 不同DevEco Studio版本的向导界面、模板默认参数等会有所不同&#xff0c;请根据实际工程需要&#xff0c;创建工程或修改工程参数。 通过如下两种方式&#xff0c;打开工程创建向…

贪心算法相关题目

文章目录 1. 什么是贪心&#xff1f;2. 分发饼干3. 摆动序列4. 最大子数组和5. 买卖股票的最佳时机 II6. 跳跃游戏7. 跳跃游戏 II8.K 次取反后最大化的数组和9.加油站10.分发糖果11.柠檬水找零12.根据身高重建队列13.用最少数量的箭引爆气球14. 无重叠区间15.划分字母区间16.合…

学习鸿蒙基础(8)

一、BuilderParam装饰器 当开发者创建了自定义组件&#xff0c;并想对该组件添加特定功能时&#xff0c;例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法&#xff0c;将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题&#xff0c;ArkUI引…

程序汪若依微服务华为云Linux部署保姆教程

若依官方有3个版本&#xff0c;程序汪以前已经出了对应的安装部署视频教程 单应用版本 前后分离版本 微服务版本 本视频是若依微服务版本&#xff0c;如果基础的环境软件都不会安装建议看下程序汪的单应用和前后端分离版本教程&#xff0c; 欢迎点击进入 &#xff08;单应…

开源流程图表库(01):Mermaid.js生成流程图、时序图、甘特图等

一、Mermaid.js的特点 Mermaid.js是一个用于生成流程图、时序图、甘特图等各种图表的开源库。它使用简洁的文本语法来描述图表结构&#xff0c;并将其转换为可视化的图形。 Mermaid.js的主要特点包括&#xff1a; 简洁易用&#xff1a;Mermaid.js使用简单的文本语法来描述图表…

嵌入式培训3-28

编写一条学生链表&#xff0c;写一些能够像链表里边添加数据的函数 实现&#xff1a;将链表中的所有内容保存到文件中去 以及 读取文件中的所有内容&#xff0c;加载到链表里面 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ma…

Python爬虫如何快速入门

写了几篇网络爬虫的博文后&#xff0c;有网友留言问Python爬虫如何入门&#xff1f;今天就来了解一下什么是爬虫&#xff0c;如何快速的上手Python爬虫。 一、什么是网络爬虫 网络爬虫&#xff0c;英文名称为Web Crawler或Spider&#xff0c;是一种通过程序在互联网上自动获取…

初识C++之命名空间(namespace)

初识C之入门 命名空间(namespace) 文章目录 初识C之入门 命名空间(namespace)1.为什么要有命名空间2. 命名空间 namespace使用方法3. 作用域限定符(::&#xff09;和 命名空间(namespace)4. 命名空间的定义5. 命名空间的嵌套6. 命名空间的使用7. 总结 1.为什么要有命名空间 在C…

部署elementPlus离线版本

最近项目需要离线开发&#xff0c;不能联网查一些组件的api&#xff0c;于是决定搞一个离线版的文档 一、下载官方文档 下载地址 github地址 gitee地址 选择版本 直接下载压缩包 二、下载live-server插件 全局下载live-server插件 npm i live-server -gvscode下载 三…

Linux split分割xls或csv文件

文件名&#xff1a;test.xls split -a 2 -d -l 100 test.xls test-a 2&#xff1a;后缀是2位 -d&#xff1a;后缀数字 -l 100 &#xff1a;每100行一个文件 test.xls&#xff1a;需要分割的文件名 test&#xff1a;分割后的文件前缀批量修改文件后缀 for i in test*; do mv $…

三位数组合-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第42讲。 三位数组合&#…

Haproxy负载均衡介绍即部署

haproxy的原理&#xff1a; 提供高可用、负载均衡以及基于TCP&#xff08;四层&#xff09;和HTTP&#xff08;七层&#xff09;应用的代理&#xff0c;支持虚拟主机&#xff0c;开源可靠的一款软件。 适用于哪些负载特别大的web站点&#xff0c;这些站点通常又需要回话保持和七…

Java项目——黑马点评(优惠券秒杀7之Redis消息队列MQ实现异步秒杀)

优惠券秒杀7——Redis消息队列实现异步秒杀 一、问题引出—— 内存溢出—— 之前我们使用的是JDK里面的阻塞队列&#xff0c;而这个队列使用的是JDK里面的内存。如果不加以阻止&#xff0c;在高并发情况下可能会有无数订单对象需要创建并且放到阻塞队列里面。可能会导致将来…

arm 外部中断

main.c: #include"key_inc.h" //封装延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}} } int main() {//按键中断的初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf("in main pro\n");delay(1…

C++自主点餐系统

一、 题目 设计一个自助点餐系统&#xff0c;方便顾客自己点餐&#xff0c;并提供对餐厅销售情况的统计和管理功能。 二、 业务流程图 三、 系统功能结构图 四、 类的设计 五、 程序代码与说明 头文件1. SystemMap.h #pragma once #ifndef SYSTEMMAP #define SYSTEMMAP #in…

【八股】泛型

泛型存在的意义&#xff1f; 为了使相同的代码适用于多种数据类型&#xff0c;也就是代码复用。 参数类型上下限限制 <?> 无限制 <? extends E> 声明了类型的上界&#xff0c;表示参数类型可以是他或他的子类。 <? super E> 声明了类型的下界&#xf…