Spring Cloud--从零开始搭建微服务基础环境【二】

news2024/11/18 11:19:42

😀前言
本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【二】,希望你能够喜欢

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

文章目录

  • 微服务基础环境搭建【二】
    • 创建会员中心微服务模块-service provider
      • 需求说明/图解
      • 思路分析/图解
      • 实现步骤
        • 创建Moduel & 完成配置
          • 创建member-service-provider-10000 微服务模块[提供会员服务]
          • 修改member-service-provider-10000 的pom.xml , 加入相关依赖
          • 创建resources/application.yml
          • 创建主启动类MemberApplication
        • 创建数据库/表
        • 业务实现
          • 创建entity
          • 创建Dao
          • 创建Service
          • 创建 Controller
        • 完成测试
          • 浏览器
          • PostMan:
        • 注意事项和细节

微服务基础环境搭建【二】

创建会员中心微服务模块-service provider

需求说明/图解

1、通过浏览器可以获取会员信息(通过会员中心微服务模块)

image-20230823163221890

  1. 使用Postman 测试查询

image-20230823163424296

思路分析/图解

1、创建Moduel 并完成配置

2、创建数据库/表

3、创建entity-dao/Mapper.xml-service-controller

4、完成测试

实现步骤

创建Moduel & 完成配置

创建member-service-provider-10000 微服务模块[提供会员服务]
  • 具体操作步骤

image-20230824212342558

image-20230824212721760

image-20230824212919589

父工程的pom.xml-会做相应变化,管理member-service-provider-10000 微服务子模块

image-20230824213348303

修改member-service-provider-10000 的pom.xml , 加入相关依赖
  1. 修改pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>e-commerce-center</artifactId>
        <groupId>com.nlc.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>member-service-provider-10000</artifactId>

    <!--引入相关的依赖: 我们引入了当前需要的依赖,后面如果有其它需要,再灵活调整-->
    <dependencies>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        
            <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
       	<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <!-- 这里我们重新指定一下version -->
            <version>1.1.13</version>
        </dependency>

        <!--引入web-starter 说明我们使用版本仲裁(从父项目继承了版本)
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!--说明:starter-actuator 是springboot程序的监控系统, 可以实现系统的健康检测
        可以通过http://localhost:80/actuator 看到相关的连接,和信息
        -->
        <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>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
       </dependency>
        
           
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
        
        <!--引入spring-boot-starter-test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>
  1. 刷新maven , 注意看引入的jar 的版本.

image-20230824214701316

创建resources/application.yml
server:
  port: 10000

spring:
  application:
    name: member-service-provider #配置应用的名称
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
#配置mybatis
mybatis:
  mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置
  type-aliases-package: com.my.springcloud.entity # 实例类所在的包,这样通过类名就可以引用
创建主启动类MemberApplication
@SpringBootApplication
public class MemberApplication10000 {
    public static void main(String[] args) {
        SpringApplication.run(MemberApplication10000.class, args);
    }
}

创建数据库/表

CREATE DATABASE e_commerce_center_db
USE e_commerce_center_db
CREATE TABLE member
(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',
NAME VARCHAR(64) COMMENT '用户名',
pwd CHAR(32) COMMENT '密码',
mobile VARCHAR(20) COMMENT '手机号码',
email VARCHAR(64) COMMENT '邮箱',
gender TINYINT COMMENT '性别',
PRIMARY KEY (id)
);
INSERT INTO member VALUES
(NULL, 'smith', MD5('123'), '123456789000', 'smith@sohu.com', 1);
SELECT * FROM member

业务实现

创建entity
@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;
}

创建com/my/springcloud/entity/Result.java

/**
* 1. 用于返回结果, 利于json 格式
* 2. 这个工具类, 在网上也可找到
*/
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;
    }
}
创建Dao

创建接口:com/my/springcloud/dao/MemberDao.java

@Mapper
public interface MemberDao {
    //crud 接口...
    Member queryMemberById(Long id);
    int save(Member member);
}

创建resources/mapper/MemberMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.my.springcloud.dao.MemberDao">

    <!--配置实现queryMemberById
    1. 这里可以使用 resultType="Member"
    2. 当然也可以使用resultMap="自定义的resultMap", 这里我们使用resultMap
    3. 如何配置一个resultMap ,在mybatis讲过的,请回顾
    -->
    <resultMap id="BaseResultMap" type="Member">
        <id column="id" property="id" jdbcType="BIGINT"></id>
        <id column="name" property="name" jdbcType="VARCHAR"></id>
        <id column="pwd" property="pwd" jdbcType="VARCHAR"></id>
        <id column="mobile" property="mobile" jdbcType="VARCHAR"></id>
        <id column="email" property="email" jdbcType="VARCHAR"></id>
        <id column="gender" property="gender" jdbcType="TINYINT"></id>
    </resultMap>

    <select id="queryMemberById" parameterType="Long" resultMap="BaseResultMap">
        SELECT * FROM `member` WHERE `id`=#{id}
    </select>

     <!--配置实现save -->
    <insert id="save" parameterType="Member" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO `member`(`NAME`,`pwd`,`mobile`,`email`,`gender`)
        VALUES(#{name}, MD5(#{pwd}), #{mobile}, #{email}, #{gender});
    </insert>
</mapper>

完成测试

创建Service

创建接口:com/my/springcloud/service/MemberService.java

public interface MemberService {
    Member queryMemberById(Long id);
    int save(Member member);
}

创建com/my/springcloud/service/impl/MemberServiceImpl.java

@Service
public class MemberServiceImpl implements MemberService {

    //装配MemberDao
    @Resource
    private MemberDao memberDao;
    @Override
    public Member queryMemberById(Long id) {
        return memberDao.queryMemberById(id);
    }
    @Override
    public int save(Member member) {
        return memberDao.save(member);
    }
}

完成测试

创建 Controller

创建:com/my/springcloud/controller/MemberController.java

@RestController
@Slf4j
public class MemberController {

    //装配MemberService
    @Resource
    private MemberService memberService;

    //添加方法/接口
    //这里请小伙伴回顾, 应该如何提交
    //说明
    //1. 我们的前端如果是以json格式来发送添加信息Member, 那么我们需要使用@RequestBody
    //   , 才能将数据封装到对应的bean, 同时保证http的请求头的 content-type是对应
    //2. 如果前端是以表单形式提交了,则不需要使用@RequestBody, 才会进行对象参数封装, 同时保证
    //   http的请求头的 content-type是对应
    @PostMapping("/member/save")
    public Result save(@RequestBody Member member) {
        log.info("service-provider member={}", member);
        int affected = memberService.save(member);
        if (affected > 0) { //说明添加成功
            return Result.success("添加会员成功", affected);
        } else {
            return Result.error("401", "添加会员失败");
        }
    }

    //查询的方法/接口
    //这里使用url占位符+@PathVariable
    @GetMapping("/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {

        //String color = request.getParameter("color");
        //String address = request.getParameter("address");
        //模拟超时, 休眠5s
        //try {
        //    TimeUnit.MILLISECONDS.sleep(5000);
        //} catch (InterruptedException e) {
        //    e.printStackTrace();
        //}

        Member member = memberService.queryMemberById(id);

        //使用Result把查询到的结果返回
        if (member != null) {
            //return Result.success("查询会员成功 member-service-provider-10000 " + color + "-" + address, member);
            return Result.success("查询会员成功 member-service-provider-10000", member);
        } else {
            return Result.error("402", "ID= " + id + "不存在");
        }

    }
}

完成测试

浏览器

浏览器输入: http://localhost:10000/member/get/1

image-20230825104014109

PostMan:
  1. 测试查询

image-20230825104159619

  1. 测试添加

image-20230825104405643

注意事项和细节

1、我们的前端如果是以json 格式来发送添加信息furn,那么我们需要使用@RequestBody,才能将数据封装到对应的bean, 同时保证http 的请求头的content-type 是对应。

image-20230825104441202

2、如果前端是以表单形式提交了/或者是以parameters,则不需要使用@RequestBody, 才会进行对象参数封装, 同时保证http 的请求头的content-type 是对应。

3、在进行SpringBoot 应用程序测试时,引入的JUnit 是org.junit.jupiter.api.Test。

4、在运行程序时,一定要确保你的XxxxMapper.xml 文件被自动放到的target 目录的classes 指定目录。

image-20230825104536551

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

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

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

相关文章

02-Flask-对象初始化参数

对象初始化参数 前言对象初始化参数import_namestatic_url_pathstatic_foldertemplate_floder 前言 本篇来学习Flask中对象初始化参数 对象初始化参数 import_name Flask程序所在的包(模块)&#xff0c;传__name__就可以 _name_ 是一个标识 Python 模块的名字的变量&#x…

随记-多租户数据隔离

数据隔离 DataBase 隔离 ( 独立数据库 )Schema 隔离 ( 共享数据库&#xff0c;但隔离数据架构 )Table 隔离 ( 共享数据库&#xff0c;共享数据架构 ) DB 隔离 即一个租户一个数据库&#xff0c;这种方案的用户数据隔离级别最高&#xff0c;安全性最好&#xff0c;但成本较高 …

软件外包开发人员分类

在软件开发中&#xff0c;通常会分为前端开发和后端开发&#xff0c;下面和大家分享软件开发中的前端开发和后端开发分类和各自的职责&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 前端开发&…

通俗易懂的子网划分(第八课)

博主换个思维方式来讲述自己学习的内容>学习这个技术的背景是啥?为什么要学习这个技术&#xff1f;如何去学习好这项技术&#xff1f;如何讲好自己学习这项技术。 一 思考下面问题带着问题找答案&#xff1f; 1 思考一下为什么要子网划分&#xff1f; 2 如何去子网划分&a…

c++11 标准模板(STL)(std::basic_stringstream)(三)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_stringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::alloc…

解决Linux Ubuntu上安装RabbitMQ服务后的公网远程访问问题,借助cpolar内网穿透技术

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

使用Windbg动态调试排查软件启动不了的问题

目录 1、问题说明 2、初步分析 3、使用Windbg启动程序进行动态调试 4、进一步分析 5、何时使用Windbg静态分析&#xff1f;何时使用Windbg进行动态调试&#xff1f; 6、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&…

Java_理解方法调用

理解方法调用 首先什么是隐式参数 --->隐式参数是调用该方法的对象本身。 接下来方法的名称和参数列表被称为方法的签名&#xff08;signature&#xff09;。在Java中&#xff0c;方法的签名由方法的名称和参数列表组成&#xff0c;用于唯一标识一个方法。返回类型不是签名的…

windows 10通过IP连接hp打印机192.168.8.115

一直点下一步。完成后要等一会儿才出现在列表里。

Win7下设置“定时关机”的方法

【Win7下设置定时关机的方法】 ●【所有程序】→【附件】→【系统工具】→【任务计划程序】 ● 右键单击&#xff0c;选择【创建基本任务】&#xff0c;然后在【任务名称】中填自定义名称&#xff0c;如“定时关机” ● 之后&#xff0c;按照下面各图的提示进行“任务触发器”…

MySQL left join 和 left outer join 区别

先说结论: left join 和 left outer join 的结果是一致的。 我不知道各位大神是怎么测试的&#xff0c;网上面就说两个不一样&#xff0c;我A、B表都是有重复数据的&#xff0c;为啥结果是一样的。 表A 表B 左连接 SELECT ta.*,tb.Result ResultB FROM TableA ta LEFT JOIN…

Linux常用命令——cupsenable命令

在线Linux命令查询工具 cupsenable 启动指定的打印机 补充说明 cupsenable命令用于启动指定的打印机。 语法 cupsenable(选项)(参数)选项 -E&#xff1a;当连接到服务器时强制使用加密&#xff1b; -U&#xff1a;指定连接服务器时使用的用户名&#xff1b; -u&#xff…

pip安装第三方库与设置

pip的使用 假如下载numpy pip install numpypypi 镜像源「配置」 常用镜像源列表 官方&#xff1a;https://pypi.org/simple 百度&#xff1a;https://mirror.baidu.com/pypi/simple/ 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里&#xff1a;https://m…

JVM介绍

一、介绍 1. JVM是什么 JVM是Java Virtual Machine的缩写&#xff0c;即咱们经常提到的Java虚拟机。虚拟机是一种抽象化的计算机&#xff0c;有着自己完善的硬件架构&#xff0c;如处理器、堆栈等&#xff0c;具体有什么咱们不做了解。目前我们只需要知道想要运行Java文件&…

sqlibs安装及复现

sqlibs安装 安装phpstudy后&#xff0c;到github上获取sqlibs源码 sqli-labs项目地址—Github获取&#xff1a;GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. 在phpstudy本地文件中的Apache目录中解压上方下载的源码。 将sq…

沃尔玛,eBay买家号成号率低如何解决?

eBay是一个很庞大的系统&#xff0c;买家号必须在本土环境才会安全。要想养出高权重的买家号&#xff0c;需要花大量的时间跟精力&#xff0c;一旦养出一批高质量且时间周期较长的买家号&#xff0c;就可以做很多事情&#xff0c;比如可以帮产品上排名&#xff0c;提高产品的权…

01_es安装和入门体验

01_es安装和入门体验 概述Elasticsearch 是什么全文搜索引擎 1. 安装环境介绍单机 & 集群集群 Cluster节点 Node 1.1 linux 单机安装1.2 集群安装1.3 window下安装 2. postMan 体验3.java客户端体验3.1 资源链接和关闭3.2 索引相关操作3.3 文档基本操作3.4 查询相关操作 概…

前端基础(Vue Router路由的使用)

前言&#xff1a;很多网站都有页面的跳转&#xff0c;那具体页面跳转是怎样实现的&#xff1f;今天学习前端SPA(Single page Application)单页面应用&#xff0c;不反复请求后端资源&#xff0c;而是通过路由实现页面的跳转。 目录 路由的创建 main.ts导入路由 App.vue文件 …

【数据库】关系模型介绍+形式化关系查询语言

目录 第2章 关系模型介绍 2.1 关系数据库的结构 关系 2.2 数据库模式 2.3 码 2.4 模式图 大学数据库的模式图&#xff01;&#xff01;&#xff01; 大学数据库关系模式&#xff01;&#xff01;&#xff01; 2.5 关系查询语言 2.6 关系运算 2. 7 总结 第6章 形式化…

OceanBase社区版4.x核心技术解密

数字化时代&#xff0c;各行各业的数据量呈现爆发式增长&#xff0c;对于海量数据价值的挖掘和应用&#xff0c;正成为推动创新的主要力量&#xff0c;与此同时&#xff0c;数据计算复杂度正在提升。在此背景下&#xff0c;对于数据处理的基石数据库而言&#xff0c;正面临市场…