一、微服务架构

业界大牛马丁.福勒(Martin Fowler) 这样描述微服务:论文网址:链接

微服务架构是一种架构模式,它提倡将单一应⽤程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相协作(通常是基于HTTP协议的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外,应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。

SpringCloud :
分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶
SpringCloud中包含了20+种技术。

1、技术选型

查看SpringCloud 和SpringBoo版本兼容性
image.png
查看SpringCloud 对其余各个技术版本的兼容性 需要转换成JSON进行查看

2、学习版本定稿

学习时必须和定稿版本一致

技术 版本
Spring Cloud Hoxton.SR1
Spring Boot 2.2.2.RELEASE
Spring Cloud Alibaba 2.1.0.RELEASE
Java 8
Maven 3.5
MySQL 5.7

3、Cloud各种组件的停更/升级/替换

停更不停用

  • bug不管了
  • 不接受GitHub合并请求
  • 不再发布新版本

服务注册中心:

  • Eureka 停更
  • Zookeeper 可用
  • Consul 可用但不推荐
  • Nacos 完美替换Eureka 推荐

服务调用:

  • Ribbon可用
  • LoadBalancer Spring 新推出 打算替代Ribbon

服务调用2:

  • Fiegn 停更
  • OpenFiegn 可用 推荐

服务降低熔断:

  • Hystrix 停更但企业大部分在使用
  • resilience4j官网推荐,国外使用的居多
  • Sentinel阿里巴巴的 强烈推荐

服务网关:

  • Zuul 停更
  • Zuul2 胎死腹中
  • gateway Spring家的,推荐

服务配置:

  • config 不推荐
  • apolo 携程的 推荐
  • Nacos 阿里巴巴的 推荐

服务总线:

  • Bus 不推荐
  • Nacos 推荐

二、SpringCloud工程创建

此父工程声明了 SpringCloud 和SpringBoot的版本 Pom工程

1、实用maven生成一个空的 project 即可 【project】

1.1 pom

的区别
图像 (2).png
图像 (2).png ```xml <?xml version=”1.0” encoding=”UTF-8”?> 4.0.0 com.springcloud cloud2020 1.0-SNAPSHOT pom UTF-8 1.8 1.8 4.12 1.2.17 1.16.18 5.1.47 1.1.16 1.3.0 org.springframework.boot spring-boot-dependencies 2.2.2.RELEASE pom import org.springframework.cloud spring-cloud-dependencies Hoxton.SR1 pom import com.alibaba.cloud spring-cloud-alibaba-dependencies 2.1.0.RELEASE pom import mysql mysql-connector-java ${mysql.version} com.alibaba druid ${druid.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.spring.boot.version} junit junit ${junit.version} log4j log4j ${log4j.version} org.projectlombok lombok ${lombok.version} true
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. <configuration>
  7. <fork>true</fork>
  8. <addResources>true</addResources>
  9. </configuration>
  10. </plugin>
  11. </plugins>
  12. </build>

  1. <a name="be9a9cdc"></a>
  2. ##
  3. <a name="fXrki"></a>
  4. ## 2、支付模块构建
  5. > 约定>配置>编码
  6. <a name="ogFrv"></a>
  7. ### 2.1 改module
  8. 创建一个module,cloud-provider-payment8001<br />因为是在父工程下创建的,所以自动继承了父工程,<br />同时 父工程中也多出来这个:
  9. ```xml
  10. <modules>
  11. <module>cloud-provider-payment8001</module>
  12. </modules>

2.2 改pom

  1. <dependencies>
  2. <!-- web -->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-web</artifactId>
  6. </dependency>
  7. <!-- 图形化监控 -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-actuator</artifactId>
  11. </dependency>
  12. <!-- mybatis 和SpringBoot 整合-->
  13. <dependency>
  14. <groupId>org.mybatis.spring.boot</groupId>
  15. <artifactId>mybatis-spring-boot-starter</artifactId>
  16. </dependency>
  17. <!-- druid 数据库连接池 -->
  18. <dependency>
  19. <groupId>com.alibaba</groupId>
  20. <artifactId>druid-spring-boot-starter</artifactId>
  21. </dependency>
  22. <!-- MySQL 驱动 -->
  23. <dependency>
  24. <groupId>mysql</groupId>
  25. <artifactId>mysql-connector-java</artifactId>
  26. </dependency>
  27. <!-- jdbc -->
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-jdbc</artifactId>
  31. </dependency>
  32. <!--热部署-->
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-devtools</artifactId>
  36. <scope>runtime</scope>
  37. <optional>true</optional>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.projectlombok</groupId>
  41. <artifactId>lombok</artifactId>
  42. <optional>true</optional>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-test</artifactId>
  47. <scope>test</scope>
  48. </dependency>

2.3 写yaml

  1. #微服务建议一定要写服务端口号和微服务名称
  2. server:
  3. #端口号
  4. port: 8001
  5. spring:
  6. application:
  7. #微服务名称
  8. name: cloud-payment-service
  9. #数据库配置
  10. datasource:
  11. type: com.zaxxer.hikari.HikariDataSource
  12. #mysql5.x的没有cj
  13. driver-class-name: com.mysql.cj.jdbc.Driver
  14. #记得先创建数据库
  15. url: jdbc:mysql://localhost:3306/springCloud?characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true
  16. username: root
  17. password: 123456
  18. #mybatis配置
  19. mybatis:
  20. mapper-locations: classpath:mapper/*.xml
  21. type-aliases-package: com.springcloud.entities #所有Entity别名类所在包

2.4 主启动类

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

2.5 业务类

  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

entities
支付表实体类

  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. public class Payment implements Serializable {
  5. private Long id;
  6. private String serial;
  7. }

通用 结果集实体类

  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. public class CommonResult<T> {
  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. }
  12. }

dao

  1. @Mapper
  2. public interface PaymentDao {
  3. int create(Payment payment);
  4. Payment getPaymentById(@Param("id") Long id);
  5. }

mapper

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.springcloud.dao.PaymentDao">
  4. <resultMap id="BaseResultMap" type="com.springcloud.entities.Payment">
  5. <id column="id" property="id" jdbcType="BIGINT"/>
  6. <id column="serial" property="serial" jdbcType="VARCHAR"/>
  7. </resultMap>
  8. <!-- Payment标红了不用管,因为我们已经在yml文件中指定了Payment的位置了 -->
  9. <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">
  10. insert into payment(serial) values(#{serial});
  11. </insert>
  12. <!--返回用resultMap,防止命名不规范-->
  13. <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
  14. select * from payment where id=#{id};
  15. </select>
  16. </mapper>

service

  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. }

controller

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

三、Devtools 热部署

添加devtools 依赖和pom插件

  1. <!-- devtools 依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-devtools</artifactId>
  5. <scope>runtime</scope>
  6. <optional>true</optional>
  7. </dependency>
  8. <!-- devtools 插件 -->
  9. <build>
  10. <plugins>
  11. <plugin>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-maven-plugin</artifactId>
  14. <configuration>
  15. <fork>true</fork>
  16. <addResources>true</addResources>
  17. </configuration>
  18. </plugin>
  19. </plugins>
  20. </build>

image.png
Ctrl+Alt+Shift+/ —->registry——>打勾
image.png
重启IDEA ——- 热部署OK!

四、消费者工程

1、使用RestTemplate来进行远程调用

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

2、使用RestTemplate

  • (url ,requestMap,ResponseBean.class) 这三个参数分别代表了(Rest请求地址、请求参数、Http响应转换被转换成的对象类型)

3、将RestTemplate添加到容器中

  1. @Configuration
  2. public class WebConfig {
  3. @Bean
  4. public RestTemplate restTemplate(){
  5. return new RestTemplate();
  6. }
  7. }

4、使用RestTemplate 调用8001端口

  1. @RestController
  2. public class OrderController {
  3. @Autowired
  4. private RestTemplate restTemplate;
  5. @PostMapping("/consumer/payment/create")
  6. public CommonResult<Payment> create(Payment payment) {
  7. log.info("********插入的数据: " + payment);
  8. //postForObject分别有三个参数:请求地址,请求参数,返回的对象类型
  9. return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
  10. }
  11. @GetMapping("/consumer/payment/get/{id}")
  12. public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
  13. log.info("********插入的数据: " + id);
  14. //getForObject两个参数:请求地址,返回的对象类型
  15. return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
  16. }
  17. }

五、实体类工程

为了更简洁的代码,减少冗余

  1. <dependencies>
  2. <!--热部署-->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-devtools</artifactId>
  6. <scope>runtime</scope>
  7. <optional>true</optional>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.projectlombok</groupId>
  11. <artifactId>lombok</artifactId>
  12. <optional>true</optional>
  13. </dependency>
  14. <dependency>
  15. <groupId>cn.hutool</groupId>
  16. <artifactId>hutool-all</artifactId>
  17. <version>5.1.0</version>
  18. </dependency>
  19. </dependencies>

maven执行命令 clean install
把其余工程中的实体类删除即可,然后把80 和8001的pom中加入commons工程依赖