• SpringCloud-Rest微服务工程的构建


    目录

    一、微服务架构总览

    二、创建Rest风格的微服务工程

             2.1 创建微服务父工程

    2.1.1 使用maven新建父工程

    2.1.2 字符编码设置

    2.1.3 修改注解设置

    2.1.4 确保java编译版本为8

    2.1.5 POM设置

    2.1.6 maven设置

    2.2 创建微服务提供者支付模块

    2.2.1 创建maven子工程

    2.2.2 改POM

    2.2.3 创建YML

    2.2.4 主启动类

    2.2.5 业务类

    2.2.6 测试

    2.3 创建微服务消费者订单模块

    2.3.1 创建maven子工程

    2.3.2 改POM

    2.3.3 写YML

    2.3.4 主启动类

    2.3.5 业务类

    2.3.6 测试

    2.4 重构项目-公共类的抽取

    2.4.1 新建一个maven项目

    2.4.2 改POM

    2.4.3 entities

    2.4.4 执行maven命令-clean、install

    2.4.5 Order、Payment模块的简化


    一、微服务架构总览

             上面是几年前的微服务常用的组件,最近几年springcloudAlibaba正逐渐成为主流。下面列出了最近较流行的微服务架构,其亮点是新增加了若干Alibaba的微服务组件,如nacos、sentinel。

    二、创建Rest风格的微服务工程

    2.1 创建微服务父工程

    2.1.1 使用maven新建父工程

    2.1.2 字符编码设置

    2.1.3 修改注解设置

    2.1.4 确保java编译版本为8

    2.1.5 POM设置

            这里有些参数会报错,不用理会。

    1. <groupId>com.atguigu.springcloudgroupId>
    2. <artifactId>mscloud03artifactId>
    3. <version>1.0-SNAPSHOTversion>
    4. <packaging>pompackaging>
    5. <properties>
    6. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    7. <maven.compiler.source>8maven.compiler.source>
    8. <maven.compiler.target>8maven.compiler.target>
    9. <junit.version>4.12junit.version>
    10. <lombok.version>1.18.10lombok.version>
    11. <log4j.version>1.2.17log4j.version>
    12. <mysql.version>5.1.47mysql.version>
    13. <druid.version>1.1.16druid.version>
    14. <mybatis.spring.boot.version>1.3.0mybatis.spring.boot.version>
    15. properties>
    16. <dependencyManagement>
    17. <dependencies>
    18. <dependency>
    19. <groupId>org.springframework.bootgroupId>
    20. <artifactId>spring-boot-dependenciesartifactId>
    21. <version>2.2.2.RELEASEversion>
    22. <type>pomtype>
    23. <scope>importscope>
    24. dependency>
    25. <dependency>
    26. <groupId>org.springframework.cloudgroupId>
    27. <artifactId>spring-cloud-dependenciesartifactId>
    28. <version>Hoxton.SR1version>
    29. <type>pomtype>
    30. <scope>importscope>
    31. dependency>
    32. <dependency>
    33. <groupId>com.alibaba.cloudgroupId>
    34. <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    35. <version>2.1.0.RELEASEversion>
    36. <type>pomtype>
    37. <scope>importscope>
    38. dependency>
    39. <dependency>
    40. <groupId>mysqlgroupId>
    41. <artifactId>mysql-connector-javaartifactId>
    42. <version>${mysql.version}version>
    43. dependency>
    44. <dependency>
    45. <groupId>com.alibabagroupId>
    46. <artifactId>druidartifactId>
    47. <version>${druid.version}version>
    48. dependency>
    49. <dependency>
    50. <groupId>org.mybatis.spring.bootgroupId>
    51. <artifactId>mybatis-spring-boot-starterartifactId>
    52. <version>${mybatis.spring.boot.version}version>
    53. dependency>
    54. <dependency>
    55. <groupId>junitgroupId>
    56. <artifactId>junitartifactId>
    57. <version>${junit.version}version>
    58. dependency>
    59. <dependency>
    60. <groupId>log4jgroupId>
    61. <artifactId>log4jartifactId>
    62. <version>${log4j.version}version>
    63. dependency>
    64. <dependency>
    65. <groupId>org.projectlombokgroupId>
    66. <artifactId>lombokartifactId>
    67. <version>${lombok.version}version>
    68. <optional>trueoptional>
    69. dependency>
    70. dependencies>
    71. dependencyManagement>
    72. <build>
    73. <plugins>
    74. <plugin>
    75. <groupId>org.springframework.bootgroupId>
    76. <artifactId>spring-boot-maven-pluginartifactId>
    77. <version>2.5.12version>
    78. <configuration>
    79. <fork>truefork>
    80. <addResources>trueaddResources>
    81. configuration>
    82. plugin>
    83. plugins>
    84. build>

    2.1.6 maven设置

            关闭 test 操作

            最后执行 install 操作,将父工程发布到仓库方便子工程继承

    2.2 创建微服务提供者支付模块

    2.2.1 创建maven子工程

           在父工程的基础上创建一个maven子工程,名字:cloud-provider-payment8001

    2.2.2 改POM

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-starter-webartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starter-actuatorartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>org.mybatis.spring.bootgroupId>
    12. <artifactId>mybatis-spring-boot-starterartifactId>
    13. dependency>
    14. <dependency>
    15. <groupId>com.alibabagroupId>
    16. <artifactId>druid-spring-boot-starterartifactId>
    17. <version>1.1.10version>
    18. dependency>
    19. <dependency>
    20. <groupId>mysqlgroupId>
    21. <artifactId>mysql-connector-javaartifactId>
    22. dependency>
    23. <dependency>
    24. <groupId>org.springframework.bootgroupId>
    25. <artifactId>spring-boot-starter-jdbcartifactId>
    26. dependency>
    27. <dependency>
    28. <groupId>org.springframework.bootgroupId>
    29. <artifactId>spring-boot-devtoolsartifactId>
    30. <scope>runtimescope>
    31. <optional>trueoptional>
    32. dependency>
    33. <dependency>
    34. <groupId>org.projectlombokgroupId>
    35. <artifactId>lombokartifactId>
    36. <optional>trueoptional>
    37. dependency>
    38. <dependency>
    39. <groupId>org.springframework.bootgroupId>
    40. <artifactId>spring-boot-starter-testartifactId>
    41. <scope>testscope>
    42. dependency>
    43. dependencies>

    2.2.3 创建YML

            注意修改数据库名字、用户名、密码

    1. # 端口号
    2. server:
    3. port: 8001
    4. spring:
    5. application:
    6. name: cloud-payment-service
    7. datasource:
    8. type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
    9. driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动
    10. url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false
    11. username: root
    12. password: 123456
    13. mybatis:
    14. mapperLocations: classpath:mapper/*.xml
    15. type-aliases-package: com.atguigu.springcloud.entities # 所有Entity别名类所在包

    2.2.4 主启动类

    1. @SpringBootApplication
    2. public class PaymentMain8001
    3. {
    4. public static void main(String[] args)
    5. {
    6. SpringApplication.run(PaymentMain8001.class,args);
    7. }
    8. }

            注意:我的idea默认不会识别出springboot的配置和配置文件。自定义主启动类类名上会有波浪线提示,按照提示在工程中添加Springmodule即可。

    2.2.5 业务类

            1. SQL表

    1. CREATE TABLE `payment` (
    2. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
    3. `serial` varchar(200) DEFAULT '',
    4. PRIMARY KEY (`id`)
    5. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

            2.entities

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. public class Payment implements Serializable
    5. {
    6. private Long id;
    7. private String serial;
    8. }
    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. public class CommonResult
    5. {
    6. private Integer code;
    7. private String message;
    8. private T data;
    9. public CommonResult(Integer code, String message)
    10. {
    11. this(code,message,null);
    12. }
    13. }

            Payment是订单实体类,CommonResult是用于统一响应请求的。

            3. mapper接口

    1. @Mapper //import org.apache.ibatis.annotations.Mapper;
    2. public interface PaymentDao
    3. {
    4. public int create(Payment payment);
    5. public Payment getPaymentById(@Param("id") Long id);
    6. }

            4. mapper映射文件

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.atguigu.springcloud.dao.PaymentDao">
    6. <insert id="create" parameterType="com.atguigu.springcloud.entities.Payment" useGeneratedKeys="true" keyProperty="id">
    7. insert into payment(serial) values (#{serial});
    8. insert>
    9. <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
    10. select *from payment where id=#{id}
    11. select>
    12. <resultMap id="BaseResultMap" type="com.atguigu.springcloud.entities.Payment">
    13. <id column="id" property="id" jdbcType="BIGINT"/>
    14. <result column="serial" property="serial" jdbcType="VARCHAR"/>
    15. resultMap>
    16. mapper>

            5. Service接口与实现类

    1. public interface PaymentService {
    2. int create(Payment payment);
    3. Payment getPaymentById(@Param("id") Long id);
    4. }
    1. @Service
    2. public class PaymentServiceImpl implements PaymentService {
    3. @Autowired
    4. private PaymentDao paymentDao;
    5. @Override
    6. public int create(Payment payment) {
    7. return paymentDao.create(payment);
    8. }
    9. @Override
    10. public Payment getPaymentById(Long id) {
    11. return paymentDao.getPaymentById(id);
    12. }
    13. }

            6. controller

    1. @RestController
    2. @Slf4j
    3. public class PaymentController
    4. {
    5. @Resource
    6. private PaymentService paymentService;
    7. @PostMapping(value = "/payment/create")
    8. //一定要使用@RequestBody注解,否则插入的数据异常
    9. public CommonResult create(@RequestBody Payment payment)
    10. {
    11. int result = paymentService.create(payment);
    12. log.info("*****插入操作返回结果:" + result);
    13. if(result > 0)
    14. {
    15. return new CommonResult(200,"插入数据库成功",result);
    16. }else{
    17. return new CommonResult(444,"插入数据库失败",null);
    18. }
    19. }
    20. @GetMapping(value = "/payment/get/{id}")
    21. public CommonResult getPaymentById(@PathVariable("id") Long id)
    22. {
    23. Payment payment = paymentService.getPaymentById(id);
    24. log.info("*****查询结果:{}",payment);
    25. if (payment != null) {
    26. return new CommonResult(200,"查询成功",payment);
    27. }else{
    28. return new CommonResult(444,"没有对应记录,查询ID: "+id,null);
    29. }
    30. }
    31. }

    2.2.6 测试

    1. 输入:http://localhost:8001/payment/get/31
    2. 响应:
    3. {
    4. "code": 200,
    5. "message": "查询成功!",
    6. "data": {
    7. "id": 31,
    8. "serial": "wzwzwz"
    9. }
    10. }

            对于Post请求,可以使用PostMan软件实现请求的发送。

    2.3 创建微服务消费者订单模块

    2.3.1 创建maven子工程

            在父工程下建子工程,名字:cloud-consumer-order80

    2.3.2 改POM

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-starter-webartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starter-actuatorartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>org.springframework.bootgroupId>
    12. <artifactId>spring-boot-devtoolsartifactId>
    13. <scope>runtimescope>
    14. <optional>trueoptional>
    15. dependency>
    16. <dependency>
    17. <groupId>org.projectlombokgroupId>
    18. <artifactId>lombokartifactId>
    19. <optional>trueoptional>
    20. dependency>
    21. <dependency>
    22. <groupId>org.springframework.bootgroupId>
    23. <artifactId>spring-boot-starter-testartifactId>
    24. <scope>testscope>
    25. dependency>
    26. dependencies>

    2.3.3 写YML

    1. #指定端口
    2. server:
    3. port: 80
    4. spring:
    5. application:
    6. name: cloud-order-service

    2.3.4 主启动类

    1. @SpringBootApplication
    2. public class MainApp80
    3. {
    4. public static void main(String[] args)
    5. {
    6. SpringApplication.run(MainApp80.class,args);
    7. }
    8. }

    2.3.5 业务类

            1. entities

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. public class Payment implements Serializable
    5. {
    6. private Long id;
    7. private String serial;
    8. }
    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. public class CommonResult {
    5. private Integer code;
    6. private String message;
    7. private T data;
    8. public CommonResult(Integer code, String message) {
    9. this.code = code;
    10. this.message = message;
    11. this.data = null;
    12. }
    13. }

             2.配置类(RestTemplate

            RestTemplate提供了多种便捷访问远程Http服务的方法, 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集

            使用:
            (url ,  requestMap ,  ResponseBean.class)

    这三个参数分别代表 REST请求地址请求参数HTTP响应被转换成对象类型

    1. @Configuration
    2. public class ApplicationContextConfig {
    3. @Bean
    4. @LoadBalanced
    5. public RestTemplate getRestTemplate(){return new RestTemplate();}
    6. }

            3. controller

    1. @RestController
    2. public class OrderController
    3. {
    4. public static final String PaymentSrv_URL = "http://localhost:8001";
    5. @Autowired
    6. private RestTemplate restTemplate;
    7. @GetMapping("/consumer/payment/create") //客户端用浏览器是get请求,但是底层实质发送post调用服务端8001
    8. public CommonResult create(Payment payment)
    9. {
    10. return restTemplate.postForObject(PaymentSrv_URL + "/payment/create",payment,CommonResult.class);
    11. }
    12. @GetMapping("/consumer/payment/get/{id}")
    13. public CommonResult getPayment(@PathVariable Long id)
    14. {
    15. return restTemplate.getForObject(PaymentSrv_URL + "/payment/get/"+id, CommonResult.class, id);
    16. }
    17. }

    2.3.6 测试

    1. 输入: http://localhost/consumer/payment/get/31
    2. 响应:
    3. {
    4. "code": 200,
    5. "message": "查询成功!",
    6. "data": {
    7. "id": 31,
    8. "serial": "wzwzwz"
    9. }
    10. }

            实际上相当于Order模块将请求转发给了Payment模块,对数据库进行操作,然后Payment模块将查询结果以JSON的形式返回Order模块,响应客户端

    2.4 重构项目-公共类的抽取

            我们可以注意到,OrderPayment模块的实体类是完全相同的,为了减少冗余,我们可以将重复的类抽取出来作为公共类,同时供多个模块使用。

    2.4.1 新建一个maven项目

            名字为:cloud-api-commons

    2.4.2 改POM

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-devtoolsartifactId>
    5. <scope>runtimescope>
    6. <optional>trueoptional>
    7. dependency>
    8. <dependency>
    9. <groupId>org.projectlombokgroupId>
    10. <artifactId>lombokartifactId>
    11. <optional>trueoptional>
    12. dependency>
    13. <dependency>
    14. <groupId>cn.hutoolgroupId>
    15. <artifactId>hutool-allartifactId>
    16. <version>5.1.0version>
    17. dependency>
    18. dependencies>

    2.4.3 entities

    1. public class CommonResult
    2. {
    3. private Integer code;
    4. private String message;
    5. private T data;
    6. public CommonResult()
    7. {
    8. }
    9. public CommonResult(Integer code, String message, T data)
    10. {
    11. this.code = code;
    12. this.message = message;
    13. this.data = data;
    14. }
    15. public CommonResult( Integer code,String message) {
    16. this( code, message,null);
    17. }
    18. public CommonResult(T data) {
    19. this(200, "操作成功", data);
    20. }
    21. //setter--getter
    22. public T getData() {
    23. return data;
    24. }
    25. public void setData(T data) {
    26. this.data = data;
    27. }
    28. public String getMessage() {
    29. return message;
    30. }
    31. public void setMessage(String message) {
    32. this.message = message;
    33. }
    34. public Integer getCode() {
    35. return code;
    36. }
    37. public void setCode(Integer code) {
    38. this.code = code;
    39. }
    40. }
    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. public class Payment implements Serializable
    5. {
    6. private Long id;
    7. private String serial;
    8. }

    2.4.4 执行maven命令-clean、install

            这样就可以将这个模块存到maven仓库,供其他模块引用了。

    2.4.5 Order、Payment模块的简化

            将entities包全部删掉,然后各自添加依赖

    1. <dependency>
    2. <groupId>com.atguigu.springcloudgroupId>
    3. <artifactId>cloud-api-commonsartifactId>
    4. <version>${project.version}version>
    5. dependency>

            这样一来,我们建立了三个子模块,可以实现基本的业务。

            1. cloud-api-commons

            2. cloud-consumer-order80

            3. cloud-provider-payment8001

  • 相关阅读:
    安卓APP源码和设计报告——快递查询录入系统
    数据库设计:防止MySQL字段名与关键字相撞,保护数据完整性!
    grub 启动
    el-row一行放置3个el-col,有时出现空行现象
    数字化采购管理系统开发:精细化采购业务流程管理,赋能企业实现“阳光采购”
    Linux 命令【8】:ssm
    新零售SaaS架构:商品系统架构设计
    Excel函数公式大全—HLOOKUP函数
    C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发
    Arduino与Proteus仿真实例-简单信号频率计数仿真
  • 原文地址:https://blog.csdn.net/weixin_62427168/article/details/126440277