一、微服务架构

业界大牛马丁.福勒(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.yixuexi.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. server:
  2. port: 8001
  3. spring:
  4. application:
  5. name: cloud-payment-service
  6. datasource:
  7. type: com.alibaba.druid.pool.DruidDataSource
  8. driver-class-name: org.gjt.mm.mysql.Driver
  9. url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false
  10. username: root
  11. password: 123456
  12. mybatis:
  13. mapperLocations: classpath:mapper/*.xml
  14. type-aliases-package: com.atguigu.springcloud.entities

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. /**
  2. * @date: 2021/4/5 0:55
  3. * @author: 易学习
  4. * @Mapper: 推荐使用@Mapper注解
  5. */
  6. @Mapper
  7. public interface PaymentDao {
  8. int create(Payment payment);
  9. Payment getPaymentById(@Param("id") Long id);
  10. }

mapper

  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.yixuexi.springcloud.dao.PaymentDao">
  6. <resultMap id="BaseResultMap" type="com.yixuexi.springcloud.entities.Payment">
  7. <id property="id" column="id"></id>
  8. <result property="serial" column="serial" jdbcType="VARCHAR"></result>
  9. </resultMap>
  10. <select id="getPaymentById" resultMap="BaseResultMap">
  11. select * from payment where id = #{id}
  12. </select>
  13. <!-- userGeneratedKeys=true 说明把插入的值返回回来,回填到对象中
  14. keyProperty="id" 说明主键是id
  15. -->
  16. <insert id="create" parameterType="com.yixuexi.springcloud.entities.Payment"
  17. useGeneratedKeys="true" keyProperty="id">
  18. insert into payment(serial) values(#{serial})
  19. </insert>
  20. </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("/create/payment")
  7. public CommonResult<Payment> create(@RequestBody Payment payment) {
  8. log.info(payment.toString());
  9. int i = paymentService.create(payment);
  10. if (i > 0) {
  11. return new CommonResult<>(200, "创建成功");
  12. } else{
  13. return new CommonResult<>(444,"创建失败");
  14. }
  15. }
  16. @GetMapping("/get/payment/{id}")
  17. public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
  18. Payment paymentById = paymentService.getPaymentById(id);
  19. if (paymentById != null){
  20. return new CommonResult<>(200,"查询成功",paymentById);
  21. }else{
  22. return new CommonResult<>(444,"未查询到");
  23. }
  24. }
  25. }

三、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/create/payment")
  6. public CommonResult<Payment> create(@RequestBody Payment payment){
  7. String url = "http://localhost:8001/create/payment";
  8. //使用 postForEntity 内部发的是post请求
  9. ResponseEntity<CommonResult> commonResultResponseEntity =
  10. restTemplate.postForEntity(url, payment, CommonResult.class);
  11. return commonResultResponseEntity.getBody();
  12. }
  13. @GetMapping("/consumer/get/payment/{id}")
  14. public CommonResult<Payment> get(@PathVariable Long id){
  15. String url = "http://localhost:8001/get/payment/";
  16. // getForObject() 内部发get 请求
  17. return restTemplate.getForObject(url+id,CommonResult.class);
  18. }
  19. }

五、实体类工程

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

  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工程依赖