服务消费微服务

文章目录

    • 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
     */
    @Bean
    public 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对象
     */
    @Resource
    private 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.mfbz.cn/a/485241.html

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

相关文章

【JavaEE初阶系列】——阻塞队列

目录 &#x1f6a9;阻塞队列的定义 &#x1f6a9;生产者消费者模型 &#x1f388;解耦性 &#x1f388;削峰填谷 &#x1f6a9;阻塞队列的实现 &#x1f4dd;基础的环形队列 &#x1f4dd;阻塞队列的形成 &#x1f4dd; 内存可见性 &#x1f4dd;阻塞队列代码 &#…

02-MySQL数据库的基本使用与密码设置

一、服务端口 3306端口和33060端口&#xff0c;是我们启动数据库后开启的监听端口&#xff1b; 3306端口&#xff1a;是我们MySQL服务的监听端口&#xff0c;用来连接数据库使用&#xff1b; 33060端口&#xff1a;MySQL-shell服务的端口&#xff0c;MySQL-shell是MySQL架构集群…

day3-QT

1>使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函。将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

DBA工作经验总结

目录 一、MySQL8.0创建一张规范的表 1.表、字段全采用小写 2.int类型不再加上最大显示宽度 3.每张表必须显式定义自增int类型的主键 4.建表时增加comment来描述字段和表的含义&#xff08;防止以后忘记&#xff09; 5.建议包含create_time和update_time字段 6.核心业务增…

FloodFill算法——力扣被围绕的区域

文章目录 题目解析算法解析代码解析 题目解析 被围绕的区域 我们来解读一下这个题目&#xff0c;这个题目的意思就是求出被X围绕的O有多少个&#xff0c;那么什么是被围绕呢&#xff1f;也就是没有出路并且连通的O不能到四条边上&#xff0c;这就算是被围绕了&#xff0c;可是…

oracle 19c RAC补丁升级

1.停止集群件备份家目录 ----两节点分别操作 cd /u01/app/19.3.0/grid/bin/ crsctl stop crstar -zcvf /u01/app.tar.gz /u01/app/u01/app/19.0.0/grid/bin/crsctl start crs2.两节点 GI、DB OPatch 替换&#xff08;都得执行&#xff09; ----# 表示 root 用户&#xff0c;$…

npm、nrm、nvm详解与应用

本文全面介绍了 npm、nrm 以及 nvm 这三个与 Node.js 开发密切相关的工具。首先&#xff0c;对 npm 进行了定义和功能解释&#xff0c;包括其在依赖管理、项目管理、脚本执行、版本控制和社区贡献等方面的作用。接着&#xff0c;详细介绍了 npm 的常用命令和设置下载源的操作&a…

SqlServer找不到SQL Server Configuration Manager(配置管理)

1、Win键 R &#xff0c;输入 compmgmt.msc 2、找到Sql Server配置管理器

iOS开发 - 转源码 - __weak问题解决

iOS开发 - 转源码 - __weak问题解决 在使用clang转换OC为C代码时&#xff0c;可能会遇到以下问题 cannot create __weak reference in file using manual reference 原因 __weak弱引用是需要runtime支持的&#xff0c;如果我们还只是使用静态编译&#xff0c;是无法正常转换的…

PCIe总线-PCIe总线简介(一)

1.概述 早期的计算机使用PCI&#xff08;Peripheral Component Interconnect&#xff09;总线与外围设备相连&#xff0c;PCI总线使用单端并行信号进行数据传输&#xff0c;由于单端信号很容易被外部系统干扰&#xff0c;其总线频率很难进一步提高。目前&#xff0c;为了提高总…

文件夹读取不到文件:深度解析与高效恢复策略

一、遭遇文件夹读取难题&#xff1a;文件离奇失踪 在日常使用电脑或移动设备的过程中&#xff0c;我们有时会遇到一个令人头疼的问题&#xff1a;原本存储着重要数据的文件夹突然变得“空空如也”&#xff0c;其中的文件仿佛凭空消失一般&#xff0c;无法正常读取。这种文件夹…

开源博客项目Blog .NET Core源码学习(10:App.Framwork项目结构分析)

开源博客项目Blog的解决方案总共包括4个项目&#xff0c;其中App.Hosting项目包括所有的页面及控制器类&#xff0c;其它项目主要提供数据库访问、基础类型定义等。这四个项目的依赖关系如下图所示&#xff0c;本文主要分析App.Framwork项目的主要结构及主要文件的用途。   …

IDEA 远程调试

1.什么是远程调试 Java提供了一个远程调试功能&#xff0c;支持设置断点及线程级的调试同时&#xff0c;不同的JVM通过接口的协议联系&#xff0c;本地的Java文件在远程JVM建立联系和通信。 2.服务端开启远程调试 开启远程调试功能&#xff0c;需要修改tomcat 的catalina.sh…

Spring Cloud Gateway Server MVC

之前你如果要用spring cloud gateway &#xff0c;就必须是webflux 的&#xff0c;也就是必须是异步响应式编程。不能和spring mvc 一起使用。现在spring cloud 新出了一个可以不用webflux的gateway。 具体使用mvc的gateway步骤如下 普通的Eureka Client的项目 如果你只是想测…

unity无法使用道路生成插件Road Architect(ctrl和shift无法标点)

切换一下布局就行了。 附&#xff1a;Road Architect教学地址

以行动激发消费活力,加多宝引领高品质消费浪潮

2024年“315”期间&#xff0c;加多宝携手全国多地市场监督管理局、消费者协会等单位&#xff0c;围绕今年“激发消费活力”主题&#xff0c;积极配合各地相关政府部门开展系列宣传活动&#xff0c;以实际行动呼吁切实保护消费者合法权益&#xff0c;共建诚信消费环境&#xff…

Kubernetes概念:服务、负载均衡和联网:2. Gateway API

Gateway API 官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/gateway/ Gateway API 通过使用可扩展的、角色导向的、 协议感知的配置机制来提供网络服务。它是一个附加组件&#xff0c; 包含可提供动态基础设施配置和高级流量路由的 API…

机器学习——AdaBoost算法

机器学习——AdaBoost算法 在机器学习领域&#xff0c;AdaBoost算法是一种非常流行的集成学习方法&#xff0c;旨在提高分类器的性能。本篇博客将介绍AdaBoost算法的原理、算法流程、算法参数&#xff0c;对比AdaBoost和随机森林的区别&#xff0c;并使用Python实现AdaBoost算…

数据结构·排序

1. 排序的概念及运用 1.1 排序的概念 排序&#xff1a;排序是将一组“无序”的记录序列&#xff0c;按照某个或某些关键字的大小&#xff0c;递增或递减归零调整为“有序”的记录序列的操作 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同关键字的记…

[Java基础揉碎]单例模式

目录 什么是设计模式 什么是单例模式 饿汉式与懒汉式 饿汉式vs懒汉式 懒汉式存在线程安全问题 什么是设计模式 1.静态方法和属性的经典使用 2.设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、 以及解决问题的思考方式。设计模式就像是经典的棋谱&am…
最新文章