服务消费微服务

news2024/9/25 15:25:52

文章目录

    • 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.coloradmin.cn/o/1542267.html

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

相关文章

nodejs+vue高校洗浴管理系统python-flask-django-php

高校洗浴管理系统采用数据库是MySQL。网站的搭建与开发采用了先进的nodejs进行编写&#xff0c;使用了express框架。该系统从两个对象&#xff1a;由管理员和学生来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对学生管理、浴室信息、浴室预约、预约…

【算法竞赛进阶指南】0x05 排序

0x05排序 排序基本算法 785. 快速排序 - AcWing题库姑且用这个评测。 1.选择、插入、冒泡 这类排序是基于比较的排序算法&#xff0c;时间复杂度为 选择排序 思路比较简单&#xff0c;就是每一次从后面选出最小的数字来与当前这个数字交换 #include<bits/stdc.h> co…

(一)基于IDEA的JAVA基础7

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

【协议-HTTPS】

https https是在http协议的基础上&#xff0c;添加了SSL/TLS握手以及数据加密传输&#xff0c;也属于应用层协议。 httpshttp加密认证完整性保护 https交互图&#xff1a; HTTPS的整体过程分为证书验证和数据传输阶段&#xff1a; ① 证书验证阶段 浏览器发起 HTTPS 请求 服务…

如何通过idea搭建一个SpringBoot的Web项目(最基础版)

通过idea搭建一个SpringBoot的Web项目 文章目录 通过idea搭建一个SpringBoot的Web项目一、打开idea&#xff0c;找到 create new project二、创建方式三、配置项目依赖四、新建项目模块五、总结 一、打开idea&#xff0c;找到 create new project 方式1 方式2 二、创建方式 新…

如何使用PHP和RabbitMQ实现消息队列?

前言 今天我们来做个小试验&#xff0c;用PHP和RabbitMQ实现消息队列功能。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 如何使用docker部署php服务_php如何使用docker发布-CSDN博客 一、安装RabbitMQ 1、创建相关目录&#xff0c;执行如下命令。…

linux 通过nvm安装node

我的博客原文&#xff1a;linux 通过nvm安装node 前言 nvm是一个node版本控制的工具&#xff0c;他可以查看可以安装的node版本&#xff0c;安装node&#xff0c;以及切换node版本&#xff0c;传统的node安装&#xff0c;我们是下载压缩包&#xff0c;然后指定环境变量&…

医院预约挂号系统设计与实现|jsp+ Mysql+Java+ Tomcat(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

MySQL数据库基本操作(增删改查)与用户授权

前言 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理关系数据库系统的语言。SQL的设计目标是提供一种简单、直观的语言&#xff0c;使得用户可以通过编写SQL语句来处理他们想要的数据和操作。 目录 一、结构介绍 1. 查看信…

计算机软件安全

一、软件安全涉及的范围 1.1软件本身的安全保密 软件的本质与特征&#xff1a; 可移植性 寄生性 再生性 可激发性 攻击性 破坏性 …… 知识产权与软件盗版 软件商品交易形式不透明&#xff0c;方式多样&#xff0c;传统商标标识方法不适用&#xff1b; 盗版方法简捷…

Django Ajax

【一】Json 【1】介绍 JSON&#xff08;javascript object otaition&#xff09;是一种轻量级的数据交换格式JSON使用了Javascript的一部分语法来定义其数据格式&#xff0c;但Json是独立于语言的Json采用完全独立于语言的文本格式&#xff0c;使得Json成为理想的数据交互语言…

PCB布线和灌铜

PCB布线和灌铜 综述&#xff1a;本文主要讲述AD软件中PCB布线的步骤和灌铜的操作。 一、PCB布线 1. 连接信号线 点击“N”→“隐藏连接”→“网络”&#xff0c;连接信号线&#xff0c;尽量走线短且尽量少打孔。单击界面下放的“top”和“bottom”可以实现不同层的绘制线路…

51单片机学习笔记——LED闪烁和流水灯

任务分析 首先要知道LED闪烁主要是怎么工作的&#xff0c;闪烁亮灭自然是一下为高一下为低&#xff0c;亮灭的频率则需要延时来进行控制。 上节已经知道了如何点亮那延时如何做呢首先先编写主框架 这样是否可以通过循环将LED灯一直循环闪烁。 以为while一直在循环所以其实是可…

PCB中常用电子器件封装学习——【一网打尽】

‘ 上图是这个世界上大概所有的封装种类&#xff0c;当然我们日常硬件电路设计肯定用不到这么多&#xff0c;接下来我将介绍几种工程上常用的封装&#xff0c;配以图片方便大家理解学习。在电子器件选型的时候&#xff0c;避免选择到一些非常难以焊接的封装电子器件。

权限提升-Windows权限提升篇数据库篇MYSQLMSSQLORACLE自动化项目

知识点 1、Web到Win-数据库提权-MSSQL 2、Web到Win-数据库提权-MYSQL 3、Web到Win-数据库提权-Oracle 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学习权限提升转移技术&#xff1…

STM32之HAL开发——系统定时器(SysTick)

系统定时器&#xff08;SysTick&#xff09;介绍 SysTick—系统定时器是属于 CM3 内核中的一个外设&#xff0c;内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器&#xff0c;计数器每计数一次的时间为 1/SYSCLK&#xff0c;一般我们设置系统时钟 SYSCLK等于 72M。当…

Django(一)- 环境搭建和快速入门

一、搭建环境 1、创建Python虚拟环境 (base) C:\Users\35351>conda create -n django_study python3.9 2、安装Django (django_study) C:\Users\35351>pip install Django >> 查看安装版本 (django_study) C:\Users\35351>python -m django --version 3、安…

使用倒模耳机壳UV树脂胶液制作舞台监听耳返入耳式耳机壳有哪些缺点?

使用倒模耳机壳UV树脂胶液制作舞台监听耳返入耳式耳机壳也存在一些缺点&#xff0c;具体如下&#xff1a; 成本较高&#xff1a;相对于传统的塑料或金属材料&#xff0c;UV树脂胶液的成本较高&#xff0c;需要更多的材料和工艺成本。制作难度较大&#xff1a;由于UV树脂的特殊…

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

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

海尔洗空气型号KFR-72LW/09HAA81U1技术分析

海尔洗空气型号为:KFR-72LW/09HAA81U1 室外机包含阀门地脚的安装尺寸是960宽703高400深mm 室外机铭牌参数: 制冷运行时 制冷量&#xff1a;7200W&#xff08;1100-9150&#xff09; 最大输入功率&#xff1a;3550W 最大电流&#xff1a;16.2A 制热运行时 制热量&#xff1a;980…