服务消费微服务

文章目录

1.示意图

2.环境搭建

1.创建会员消费微服务模块
2.删除不必要的两个文件
3.检查父子模块的pom.xml文件
1.子模块
2.父模块
4.pom.xml 添加依赖(刷新)
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 配置监听端口和服务名
yaml 复制代码
server:
  port: 80 # 监听80端口
spring:
  application:
    name: member-service-consumer-80
6.com/sun/springcloud/MemberConsumerApplication.java 创建启动类测试
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端口被占用
2.打开命令行输入 netstat -anb 查看是谁占用了80端口
3.只能更换端口,使用 netstat -aon | findstr :81 来查看81端口被没被占用
  • 没有响应,说明没有被占用
4.application.yml 更换端口和名字为81
yaml 复制代码
server:
  port: 81 # 监听81端口
spring:
  application:
    name: member-service-consumer-81
5.再次测试运行,成功在81端口监听
6.浏览器请求测试
7.更换项目名称为81(这样直接就知道这个服务在81端口监听)
8.细节说明
1.如果报错说数据库有问题,可能就是在pom.xml中保留了mybatis的依赖
2.解决方案:启动类排除数据源自动配置

3.代码实现

1.com/sun/springcloud/entity/Member.java 创建entity与会员中心模块保持一致
  • 因为需要使用这个实体类来接收信息,然后调用会员中心模块
java 复制代码
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工具类
java 复制代码
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 基本介绍
4.com/sun/springcloud/config/CustomizationBean.java 配置类注入RestTemplate的bean对象
java 复制代码
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接口的中转站
java 复制代码
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.首先启动会员中心微服务
2.启动服务消费微服务
3.postman测试
4.数据库信息
7.注意事项
1.RestTemplate发送请求的细节
  • 通过RestTemplate发送请求携带的参数会自动转换为json格式的数据
  • 所以在接受RestTemplate的参数中必须要加@RequestBody注解
2.entity实体类需要实现Serializable接口实现可序列化
  • 原因是使用RestTemplate传递参数时可能需要序列化
3.在这个案例中
  • 参数并没有@RequestBody注解,所以需要通过表单传入数据
8.com/sun/springcloud/controller/MemberConsumerController.java 新增方法
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测试
10.注意事项和细节
1.开启Run Dashboard/Service
1.打开 .idea/workspace.xml
2.粘贴配置代码到这里
3.配置代码
xml 复制代码
  <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.重启项目
5.查看Services
6.可以在这启动项目
7.启动之后的效果
2.关于微服务的细节
1.对微服务的理解
  • 一个ip+端口就是一个微服务
  • 访问微服务的方式是ip + 端口 + 上下文路径(可以是根目录)+ 资源路径
2.每个微服务接口的组成
  • url
  • 请求方式
  • 参数
  • 返回值

4.创建一个共用模块

1.创建公共模块 e_commerce_center-common-api
2.检查父子的pom.xml
1.子pom.xml
2.父pom.xml
3.pom.xml 引入依赖(刷新)
xml 复制代码
    <dependencies>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <!-- optional为true表示两个模块之间依赖不传递,也就是其他模块引入这个共用模块时,不传递这个模块的lombok依赖 -->
            <optional>true</optional>
        </dependency>
    </dependencies>
4.抽取共用api
5.maven打成jar包
6.target目录生成jar包
7.package和install的区别(部署项目的时候打包使用package)
  • package命令主要用于项目的编译和打包,但不会将产物安装到本地仓库,主要用于构建过程的测试和验证。
  • install命令在执行package的基础上,进一步将打包后的文件安装到本地Maven仓库,便于其他项目的依赖引用。
8.工程重构
1.删除两个模块的Member和Result类,此时会报错
2.两个模块的pom.xml都引入刚才的jar包
1.查找公共模块jar包的坐标
2.pom.xml分别引入jar包
xml 复制代码
        <!-- 公共模块的jar包 -->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
3.重启两个模块进行测试
1.重启
2.测试
相关推荐
javaDocker4 小时前
业务架构、数据架构、应用架构和技术架构
架构
JosieBook5 小时前
【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍
架构
.生产的驴6 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
喵叔哟6 小时前
16. 【.NET 8 实战--孢子记账--从单体到微服务】--汇率获取定时器
微服务·oracle·.net
Smile丶凉轩6 小时前
微服务即时通讯系统的实现(服务端)----(1)
c++·git·微服务·github
丁总学Java7 小时前
ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
arm开发·架构
运维&陈同学8 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
ZOMI酱9 小时前
【AI系统】GPU 架构与 CUDA 关系
人工智能·架构
猿java9 小时前
什么是 Hystrix?它的工作原理是什么?
java·微服务·面试