day02-搭建微服务基础环境01

打印 上一主题 下一主题

主题 962|帖子 962|积分 2886

搭建微服务基础环境01

1.创建父工程,用于聚合其他微服务模块

1.1创建父项目

说明:我们先创建一个父项目,该父项目会去管理多个微服务模块(module),如下:
(1)File-New-Project-Maven,选择如下:
(2)输入项目名称等信息,然后next
(3)选择Maven,然后Finish
1.2项目设置

(1)File-Settings-Editor-File Encodings,将编码改为UTF-8,点击Apply
(2)Settings-Build,Execution,Deployment-Compiler-Java Compiler,将项目的编译版本改为8,点击OK
(3)删除父项目的src目录
(4)配置父项目的pom.xml,配置各个依赖版本
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.   <modelVersion>4.0.0</modelVersion>
  5.   <groupId>com.li.springcloud</groupId>
  6.   <artifactId>E-Commerce-Center</artifactId>
  7.   <version>1.0-SNAPSHOT</version>
  8.   
  9.   <packaging>pom</packaging>
  10.   <name>E-Commerce-Center</name>
  11.   
  12.   <url>http://www.example.com</url>
  13.   
  14.   <properties>
  15.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16.     <maven.compiler.source>1.8</maven.compiler.source>
  17.     <maven.compiler.target>1.8</maven.compiler.target>
  18.     <junit.version>4.12</junit.version>
  19.    
  20.     <log4j.version>2.17.2</log4j.version>
  21.     <lombok.version>1.18.20</lombok.version>
  22.     <mysql.version>5.1.47</mysql.version>
  23.     <druid.version>1.1.17</druid.version>
  24.     <mybatis.spring.boot.version>2.2.0</mybatis.spring.boot.version>
  25.   </properties>
  26.   
  27.   <dependencyManagement>
  28.   <dependencies>
  29.    
  30.     <dependency>
  31.       <groupId>org.springframework.boot</groupId>
  32.       <artifactId>spring-boot-dependencies</artifactId>
  33.       <version>2.2.2.RELEASE</version>
  34.       
  35.       <type>pom</type>
  36.       <scope>import</scope>
  37.     </dependency>
  38.    
  39.     <dependency>
  40.       <groupId>org.springframework.cloud</groupId>
  41.       <artifactId>spring-cloud-dependencies</artifactId>
  42.       <version>Hoxton.SR1</version>
  43.       <type>pom</type>
  44.       <scope>import</scope>
  45.     </dependency>
  46.    
  47.     <dependency>
  48.       <groupId>com.alibaba.cloud</groupId>
  49.       <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  50.       <version>2.1.0.RELEASE</version>
  51.       <type>pom</type>
  52.       <scope>import</scope>
  53.     </dependency>
  54.    
  55.     <dependency>
  56.       <groupId>mysql</groupId>
  57.       <artifactId>mysql-connector-java</artifactId>
  58.       <version>${mysql.version}</version>
  59.     </dependency>
  60.    
  61.     <dependency>
  62.       <groupId>com.alibaba</groupId>
  63.       <artifactId>druid</artifactId>
  64.       <version>${druid.version}</version>
  65.     </dependency>
  66.    
  67.     <dependency>
  68.       <groupId>org.mybatis.spring.boot</groupId>
  69.       <artifactId>mybatis-spring-boot-starter</artifactId>
  70.       <version>${mybatis.spring.boot.version}</version>
  71.     </dependency>
  72.    
  73.     <dependency>
  74.       <groupId>org.apache.logging.log4j</groupId>
  75.       <artifactId>log4j</artifactId>
  76.       <version>${log4j.version}</version>
  77.     </dependency>
  78.    
  79.     <dependency>
  80.       <groupId>junit</groupId>
  81.       <artifactId>junit</artifactId>
  82.       <version>${junit.version}</version>
  83.     </dependency>
  84.    
  85.     <dependency>
  86.       <groupId>org.projectlombok</groupId>
  87.       <artifactId>lombok</artifactId>
  88.       <version>${lombok.version}</version>
  89.     </dependency>
  90.   </dependencies>
  91.   </dependencyManagement>
  92.    
  93. -->
  94. </project>
复制代码
1.3dependencyManagement说明


  • Maven 使用 dependencyManagement 元素来提供了一种管理依赖版本号的方式。通常在packaging为pom的项目中使用该元素
  • 使用 pom.xml 中的 dependencyManagement 元素能让所有子项目引用一个依赖 ,Maven 会沿着父子层次向 上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用这个dependencyManagement 元素中指定的版本号。
  • 好处∶如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,当升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要分别在子项目中修改;另外如果某子项目需要另外的版本时,子项目只需要声明 version 就可。
  • dependencyManagement 里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
  • 如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本时,才会从父项目中继承该项,并且version 和 scope 都读取自父 pom。作用范围一览图:

  • 如果子项目中指定了版本号,那么会使用子项目中指定的 jar 版本
2.创建会员中心微服务模块-service provider

2.1需求分析


  • 通过浏览器可以获取会员信息(通过会员中心微服务模块)
  • 可以通过postman进行测试查询和添加数据
2.2思路分析


  • 创建Module & 完成配置
  • 创建数据库 & 表
  • 创建 entity-dao/mapper.xml-service-controller
  • 完成测试
2.3实现步骤

2.3.1创建Module&完成配置

(1)创建名为 member-service-provider-10000 的微服务模块,提供会员服务。member代表会员服务,service-provider代表这是一个提供服务的模块,10000代表端口。
依次选择:File-New-Module
(2)选择Maven,直接下一步
(3)idea会自动识别父工程,如下,然后点击Finish
(4)如果创建成功,父项目会自动聚合子模块。父项目的pom.xml文件:
(5)修改member-service-provider-10000子模块的pom.xml,加入相关依赖
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <parent>
  6.         <artifactId>E-Commerce-Center</artifactId>
  7.         <groupId>com.li.springcloud</groupId>
  8.         <version>1.0-SNAPSHOT</version>
  9.     </parent>
  10.     <modelVersion>4.0.0</modelVersion>
  11.     <artifactId>member-service-provider-10000</artifactId>
  12.     <properties>
  13.         <maven.compiler.source>8</maven.compiler.source>
  14.         <maven.compiler.target>8</maven.compiler.target>
  15.     </properties>
  16.    
  17.     <dependencies>
  18.         
  19.         <dependency>
  20.             <groupId>org.springframework.boot</groupId>
  21.             <artifactId>spring-boot-starter-web</artifactId>
  22.         </dependency>
  23.         
  24.         <dependency>
  25.             <groupId>org.springframework.boot</groupId>
  26.             <artifactId>spring-boot-starter-actuator</artifactId>
  27.         </dependency>
  28.         
  29.         <dependency>
  30.             <groupId>org.mybatis.spring.boot</groupId>
  31.             <artifactId>mybatis-spring-boot-starter</artifactId>
  32.         </dependency>
  33.         
  34.         <dependency>
  35.             <groupId>com.alibaba</groupId>
  36.             <artifactId>druid-spring-boot-starter</artifactId>
  37.             
  38.             <version>1.1.17</version>
  39.         </dependency>
  40.         
  41.         <dependency>
  42.             <groupId>mysql</groupId>
  43.             <artifactId>mysql-connector-java</artifactId>
  44.         </dependency>
  45.         
  46.         <dependency>
  47.             <groupId>org.springframework.boot</groupId>
  48.             <artifactId>spring-boot-starter-jdbc</artifactId>
  49.         </dependency>
  50.         
  51.         <dependency>
  52.             <groupId>org.projectlombok</groupId>
  53.             <artifactId>lombok</artifactId>
  54.         </dependency>
  55.         
  56.         <dependency>
  57.             <groupId>org.springframework.boot</groupId>
  58.             <artifactId>spring-boot-starter-test</artifactId>
  59.         </dependency>
  60.     </dependencies>
  61. </project>
复制代码
(6)在member-service-provider-10000子模块中创建resources/application.yml文件
  1. server:
  2.   port: 10000
  3. spring:
  4.   application:
  5.     name: member-service-provider-10000 #配置应用的名称
  6.   datasource:
  7.     type: com.alibaba.druid.pool.DruidDataSource #指定数据源类型
  8.     url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
  9.     username: root
  10.     password: 123456
  11. mybatis:
  12.   mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置
  13.   type-aliases-package: com.li.springcloud.entity #实体类的包,这样通过类名就可以引用
复制代码
(7)启动子模块的主程序:
  1. package com.li.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. /**
  5. * @author 李
  6. * @version 1.0
  7. */
  8. @SpringBootApplication
  9. public class MemberApplication {
  10.     public static void main(String[] args) {
  11.         SpringApplication.run(MemberApplication.class, args);
  12.     }
  13. }
复制代码
测试结果:运行成功。
2.3.2创建数据库&表
  1. -- 创建数据库
  2. CREATE DATABASE e_commerce_center_db
  3. USE e_commerce_center_db
  4. -- 创建member表
  5. CREATE TABLE `member`(
  6. `id`                 BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',
  7. `name`                 VARCHAR(64) COMMENT '用户名',
  8. `pwd`                 CHAR(32) COMMENT '密码',
  9. `mobile`         VARCHAR(20) COMMENT '手机号码',
  10. `email`         VARCHAR(64) COMMENT '邮箱',
  11. `gender`         TINYINT COMMENT '性别',
  12. PRIMARY KEY (id)
  13. );
  14. -- 测试数据
  15. INSERT INTO member
  16. VALUES(NULL, 'smith', MD5('123'), '123456789000', 'smith@sohu.com', 1);
  17. SELECT * FROM member;
复制代码
2.3.3业务实现

2.3.3.1utils层

Result工具类,用于同一返回的数据类型
  1. package com.li.springcloud.utils;
  2. /**
  3. * @author 李
  4. * @version 1.0
  5. 返回结果对象,以json格式返回
  6. */
  7. public class Result<T> {
  8.     private String code;//状态码 200-success 400-fail
  9.     private String msg;//状态说明
  10.     private T data;//返回的数据,使用泛型
  11.     public Result() {
  12.     }
  13.     public Result(T data) {
  14.         this.data = data;
  15.     }
  16.     //返回需要的result对象,表示成功
  17.     public static Result success() {
  18.         Result result = new Result<>();
  19.         result.setCode("200");
  20.         result.setMsg("success");
  21.         return result;
  22.     }
  23.     //返回成功的result对象,表示成功,同时携带数据
  24.     //如果需要在static方法中使用泛型,需要在static关键字后添加<T>
  25.     public static <T> Result<T> success(T data) {
  26.         Result<T> result = new Result<>(data);
  27.         result.setCode("200");
  28.         result.setMsg("success");
  29.         return result;
  30.     }
  31.    
  32.     //返回成功的result对象,表示成功,同时携带数据和自定义msg
  33.     public static <T> Result<T> success(String msg, T data) {
  34.         Result<T> result = new Result<>(data);
  35.         result.setCode("200");
  36.         result.setMsg(msg);
  37.         return result;
  38.     }
  39.     //返回需要的result对象-表示失败
  40.     //因为失败的原因有很多中,因此直接将其作为参数传进来
  41.     public static Result error(String code, String msg) {
  42.         Result result = new Result<>();
  43.         result.setCode(code);
  44.         result.setMsg(msg);
  45.         return result;
  46.     }
  47.     //返回成功的result对象,表示失败,同时携带数据
  48.     public static <T> Result<T> error(String code, String msg, T data) {
  49.         Result<T> result = new Result<>(data);
  50.         result.setCode(code);
  51.         result.setMsg(msg);
  52.         return result;
  53.     }
  54.     //getter、setter方法省略
  55. }
复制代码
2.3.3.2entity层

Member实体类:
  1. package com.li.springcloud.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. /**
  6. * @author 李
  7. * @version 1.0
  8. */
  9. @Data
  10. @AllArgsConstructor
  11. @NoArgsConstructor
  12. public class Member {
  13.     private Long id;
  14.     private String name;
  15.     private String pwd;
  16.     private String mobile;
  17.     private String email;
  18.     private Integer gender;
  19. }
复制代码
2.3.3.3dao层

Member对应的Dao层接口:MemberDao.java
  1. package com.li.springcloud.dao;
  2. import com.li.springcloud.entity.Member;
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. */
  7. public interface MemberDao {
  8.     //根据id返回member对象
  9.     public Member queryMemberById(Long id);
  10.     //添加member
  11.     public int save(Member member);
  12. }
复制代码
如果在这里不添加@Mapper注解,则需要在主程序中添加@MapperScan(basePackages = {"com.li.springcloud.dao"})
在 resources/mapper/MemberMapper.xml 中实现接口:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.li.springcloud.dao.MemberDao">
  6.    
  7.     <resultMap id="BaseResultMap" type="com.li.springcloud.entity.Member">
  8.         <id column="id" property="id" jdbcType="BIGINT"></id>
  9.         <id column="name" property="name" jdbcType="VARCHAR"></id>
  10.         <id column="pwd" property="pwd" jdbcType="VARCHAR"></id>
  11.         <id column="mobile" property="mobile" jdbcType="VARCHAR"></id>
  12.         <id column="email" property="email" jdbcType="VARCHAR"></id>
  13.         <id column="gender" property="gender" jdbcType="TINYINT"></id>
  14.     </resultMap>
  15.    
  16.     <select id="queryMemberById" parameterType="Long" resultMap="BaseResultMap">
  17.         SELECT * FROM `member` WHERE `id` = #{id}
  18.     </select>
  19.    
  20.     <insert id="save" parameterType="Member" useGeneratedKeys="true" keyProperty="id">
  21.         INSERT INTO `member` (`name`, `pwd`, `mobile`, `email`, `gender`)
  22.         VALUES (#{name}, MD5(#{pwd}), #{mobile}, #{email}, #{gender});
  23.     </insert>
  24. </mapper>
复制代码
测试类:
注意:测试类需要和主程序在同一个路径下,否则需要手动指定class
  1. package com.li.springcloud;
  2. import ...
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. */
  7. @SpringBootTest
  8. @Slf4j
  9. public class MemberApplicationTest {
  10.     //装配MemberDao
  11.     @Resource
  12.     private MemberDao memberDao;
  13.     @Test //注意:引入的是 org.junit.jupiter.api.Test;
  14.     public void queryMemberById() {
  15.         Member member = memberDao.queryMemberById(1L);
  16.         log.info("member={}", member);
  17.     }
  18.     @Test //引入的是 org.junit.jupiter.api.Test;
  19.     public void save() {
  20.         Member member =
  21.                 new Member(null, "牛魔王", "123456", "18077560000", "jack@qq.com", 1);
  22.         int save = memberDao.save(member);
  23.         log.info("受影响的行数={}", save);
  24.     }
  25. }
复制代码
queryMemberById()测试结果:
  1. member=Member(id=1, name=smith, pwd=202cb962ac59075b964b07152d234b70, mobile=123456789000, email=smith@sohu.com, gender=1)
复制代码
save()测试结果:
  1. 受影响的行数=1
复制代码
2.3.3.4service层

MemberService接口:
  1. package com.li.springcloud.service;
  2. import com.li.springcloud.entity.Member;
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. */
  7. public interface MemberService {
  8.     //根据id返回member
  9.     public Member queryMemberById(Long id);
  10.     //添加member
  11.     public int save(Member member);
  12. }
复制代码
MemberServiceImpl实现类:
  1. package com.li.springcloud.service.impl;
  2. import ...
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. */
  7. @Service
  8. public class MemberServiceImpl implements MemberService {
  9.     @Resource
  10.     private MemberDao memberDao;
  11.     @Override
  12.     public Member queryMemberById(Long id) {
  13.         return memberDao.queryMemberById(id);
  14.     }
  15.     @Override
  16.     public int save(Member member) {
  17.         return memberDao.save(member);
  18.     }
  19. }
复制代码
测试类:
  1. package com.li.springcloud;
  2. import ...
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. */
  7. @SpringBootTest
  8. @Slf4j
  9. public class MemberApplicationTest {
  10.     //装配MemberService
  11.     @Resource
  12.     private MemberService memberService;
  13.     @Test
  14.     public void queryMemberById() {
  15.         Member member = memberService.queryMemberById(3L);
  16.         log.info("member={}", member);
  17.     }
  18.     @Test
  19.     public void save() {
  20.         Member member =
  21.             new Member(null, "tomas", "hahah123", "0773-2345-678", "tomas@qq.com", 0);
  22.         int save = memberService.save(member);
  23.         log.info("受影响的行数={}", save);
  24.     }
  25. }
复制代码
queryMemberById()测试结果:
  1. member=Member(id=3, name=jack, pwd=202cb962ac59075b964b07152d234b70, mobile=123456789000, email=smith@sohu.com, gender=1)
复制代码
save()测试结果:
  1. 受影响的行数=1
复制代码
2.3.3.5controller层
  1. package com.li.springcloud.controller;
  2. import ...
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. */
  7. @Controller
  8. @Slf4j
  9. public class MemberController {
  10.     @Resource
  11.     private MemberService memberService;
  12.     @PostMapping("/member/save")
  13.     @ResponseBody
  14.     public Result save(Member member) {
  15.         int affected = memberService.save(member);
  16.         if (affected > 0) {
  17.             return Result.success("添加会员成功", affected);
  18.         } else {
  19.             return Result.error("401", "添加会员失败");
  20.         }
  21.     }
  22.     @GetMapping("/member/get/{id}")
  23.     @ResponseBody
  24.     public Result getMemberById(@PathVariable("id") Long id) {
  25.         Member member = memberService.queryMemberById(id);
  26.         if (member != null) {
  27.             return Result.success("查询成功", member);
  28.         } else {
  29.             return Result.error("402", "Id=" + id + "用户不存在!");
  30.         }
  31.     }
  32. }
复制代码
2.3.4完成测试

(1)测试controller的save()方法
使用postman进行测试
返回结果:
数据成功插入表中:
(2)测试controller的getMemberById()方法
测试成功。
2.4注意事项和细节


  • 如果前端是以json格式来发送数据的,需要在controller层的方法参数前使用@RequestBody,来将json数据封装成对应的Javabean。同时需要保证前端发送的http请求头中,Content-Type指定的是json格式。
  • 如果前端是以表单或者参数提交的,则不需要@RequestBody
  • 在进行springboot应用程序测试时,引入的JUnit是 org.junit.jupiter.api.Test 包的
  • 在运行程序时,一定要确保你的 XxxMapper.xml文件被自动放到了 target 目录的 classes 指定的目录下


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表