服务消费微服务

news/2024/7/4 8:11:10 标签: 微服务, 架构, 云原生

文章目录

    • 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.关于微服务的细节
    • 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.niftyadmin.cn/n/5448981.html

相关文章

橘子疾病检测4种YOLOV8

橘子检测YOLOV8&#xff0c;检测4种疾病&#xff0c;采用YOLOV8-NANO&#xff0c;训练得到PT模型转换成ONNX&#xff0c;最后OPENCV调用&#xff0c;支持C/PYTHON/ANDROID 橘子检测YOLOV8&#xff0c;检测4种疾病

Java IO的基本使用和常见类的介绍及其案例讲解

Java IO&#xff08;Input/Output&#xff09;是Java编程语言中用于处理输入输出的机制。IO包含了读取和写入数据的功能&#xff0c;可以实现文件的读写、网络通信、和各种设备的输入输出操作。在Java中&#xff0c;IO操作主要由输入流&#xff08;Input Stream&#xff09;和输…

(一)基于IDEA的JAVA基础7

关系运算符 运算符 含义 范例 结果 等于 12 false &#xff01; 不等于 1&#xff01;2 true > 大于 1>2 false < 小于 …

RAG - QA + Qwen + dashscope

文章目录 一、关于项目二、准备1、安装依赖包2、准备数据集3、准备 API-Key 三、代码实现准备数据生成 embeddings检索方法问答 转载改编自&#xff1a;qwen_doc_search_QA_based_on_dashscope.ipynb https://github.com/modelscope/modelscope/blob/master/examples/pytorch/a…

基于大数据的空气质量预测和可视化分析

城市空气质量数据采集系统设计与实现 &#x1f3d9;️ 研究背景 &#x1f32c;️ 城市化与环境挑战&#xff1a;随着城市化进程的加快&#xff0c;环境污染问题&#xff0c;尤其是空气质量问题&#xff0c;已成为公众关注的焦点。数据监测的重要性&#xff1a;城市空气质量数…

02.percona Toolkit工具pt-archiver命令实践

1.命令作用 Percona Toolkit有的32个命令&#xff0c;可以分为7大类 工具类别 工具命令 工具作用 备注 开发类 pt-duplicate-key-checker 列出并删除重复的索引和外键 pt-online-schema-change 在线修改表结构 pt-query-advisor 分析查询语句&#xff0c;并给出建议&#x…

电子电器架构 —— 诊断数据DTC具体故障篇

电子电器架构 —— 诊断数据DTC起始篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎…

vscode配置c/c++调试环境

本文记录win平台使用vscode远程连接ubuntu server服务器下&#xff0c;如何配置c/c调试环境。 过程 1. 服务器配置编译环境 这里的前置条件是vscode已经能够连接到服务器&#xff0c;第一步安装编译构建套件&#xff08;gcc、g、make、链接器等&#xff09;和调试器&#xf…