微服务概念和项目构建

B站尚硅谷P1~P14
代码Gitee地址

1. 微服务

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

2. SpringCloud

分布式微服务的一站式解决方案,多种微服务架构落地技术的集合体,全家桶

  • 技术架构

在这里插入图片描述

  • 版本选择:由于SpringCloud需要强烈对应SpringBoot版本,为了避免多余错误选型如下:
  1. SpringCloud:Hoxton.SR1;
  2. SpringBoot:2.2.2.RELEASE;
  3. SpringCloudAlibab:2.1.0.RELEASE;
  4. Java:JDK8;
  5. Maven:3.5及以上;
  6. MySQL:5.7及以上。
  • 框架升级结构:明显可以看出之前学习的网飞框架全死了。
    在这里插入图片描述

3. 父项目构建

  • 新建maven父项目,选择下图选项。
    在这里插入图片描述

  • 修改父pom文件

    <?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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>org.example</groupId>
      <artifactId>jm-cloud</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>pom</packaging>
      <name>Maven</name>
    
    <!--  统一jar 管理-->
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
      </properties>
    
    <!--  统一依赖版本管理 子模块直接继承-->
      <dependencyManagement>
        <dependencies>
    
          <!--spring boot 2.2.2-->
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
    
          <!--spring cloud Hoxton.SR1-->
          <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR1</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
    
          <!--spring cloud alibaba 2.1.0.RELEASE-->
          <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
    
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
          </dependency>
    
          <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
          </dependency>
    
          <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.spring.boot.version}</version>
          </dependency>
    
          <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
          </dependency>
    
          <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
          </dependency>
    
          <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <optional>true</optional>
          </dependency>
    
        </dependencies>
      </dependencyManagement>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
              <fork>true</fork>
              <addResources>true</addResources>
            </configuration>
          </plugin>
        </plugins>
      </build>
    
    
    </project>
    
    
  • 忽略maven的test
    在这里插入图片描述

4. 服务模块搭建

这里以一个支付环境为例子来演示。

4.1 支付模块——服务提供者

  • 新建model
    新建

  • 选择maven项目,名称为cloud-provider-payment8001

  • 修改pom

    <?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>jm-cloud</artifactId>
            <groupId>org.example</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>cloud-provider-payment8001</artifactId>
    
        <dependencies>
    
            <dependency>
                <groupId>org.example</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.2.9</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
    
        </dependencies>
    
    </project>
    
  • 新建SpringBoot配置文件

    server:
      port: 8001
    
    spring:
      application:
        name: cloud-payment-service
    
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.gjt.mm.mysql.Driver
        url: jdbc:mysql://localhost:3306/jm-cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
    
    mybatis:
      mapper-locations: classpath:mapper/*.xml
      type-aliases-package: com.jm.cloud.domain   # 实体类路径
    
  • 新建SpringBoot启动类

    /**
     * @Description
     * @date 2022/6/8 9:47
     */
    @SpringBootApplication
    public class PaymentMain8001 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8001.class,args);
        }
    }
    
    
  • 数据库表和实体类

    DROP TABLE IF EXISTS `payment`;
    CREATE TABLE `payment`
    (
        `id`     bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
        `serial` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '支付流水号',
        PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '支付表' ROW_FORMAT = Dynamic;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Payment implements Serializable {
    
        private Long id;
    
        private String serial;
    
    }
    
  • 封装返回类

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class CommonResult<T> {
    
        private Integer code;
    
        private String msg;
    
        private T data;
    
        public CommonResult(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
    }
    
  • dao接口

    /**
     * @Description
     * @date 2022/6/8 10:01
     */
    @Mapper
    public interface PaymentDao {
    
        /**
         * 创建订单
         * @param payment
         * @return
         */
        int create(Payment payment);
    
    
        /**
         * 根据id获取订单信息
         * @param id
         * @return
         */
        Payment getPaymentById(@Param("id") Long id);
    
    }
    
  • dao层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.jm.cloud.dao.PaymentDao">
    
        <resultMap id="BaseResultMap" type="com.jm.cloud.domain.Payment">
            <result property="id" column="id" jdbcType="BIGINT"/>
            <result property="serial" column="serial" jdbcType="VARCHAR"/>
        </resultMap>
    
        <select id="getPaymentById" resultMap="BaseResultMap" parameterType="java.lang.Long">
            select
                   id,
                   serial
            from
                 payment
            where
                  id = #{id}
        </select>
    
        <insert id="create" parameterType="com.jm.cloud.domain.Payment" keyProperty="id" useGeneratedKeys="true">
            insert into
                payment(serial)
            values
                   (#{serial})
        </insert>
    </mapper>
    
  • service层

    public interface PaymentService {
    
        /**
         * 创建订单
         * @param payment
         * @return
         */
        int create(Payment payment);
    
    
        /**
         * 根据id获取订单信息
         * @param id
         * @return
         */
        Payment getPaymentById(@Param("id") Long id);
    
    }
    
    
    @Service
    public class PaymentServiceImpl implements PaymentService {
    
        @Autowired
        private PaymentDao paymentDao;
    
        @Override
        public int create(Payment payment) {
            return paymentDao.create(payment);
        }
    
        @Override
        public Payment getPaymentById(Long id) {
            return paymentDao.getPaymentById(id);
        }
    }
    
  • controller层

    @Slf4j
    @RestController
    @RequestMapping("/payment")
    public class PaymentController {
    
        @Autowired
        private PaymentService paymentService;
    
        /**
         * 新增订单
         * @param payment
         * @return
         */
        @PostMapping("/create")
        public CommonResult create(@RequestBody Payment payment){
            boolean result = paymentService.create(payment) > 0;
            log.info("插入结果:" + result);
            return result ?
                    new CommonResult(200,"插入成功"):
                    new CommonResult(444,"插入失败");
        }
    
        /**
         * 根据id查询订单信息
         * @param id
         * @return
         */
        @GetMapping("/{id}")
        public CommonResult create(@PathVariable("id") Long id){
            Payment payment = paymentService.getPaymentById(id);
            log.info("查询结果:" + payment);
            return !Objects.isNull(payment) ?
                    new CommonResult<Payment>(200,"查询成功",payment):
                    new CommonResult(444,"没有当前id=" + id + "对应数据");
        }
    
    }
    
    

4.2 抽取公共类和开启热部署

4.2.1 抽取公共类
  • 使用mavn新建module:cloud-api-commons

  • 引入依赖:

     
        <dependencies>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
    
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.3.3</version>
            </dependency>
        </dependencies>
    
    
  • 将4.1中服务提供者的实体类移动到当前项目下:
    在这里插入图片描述

  • 将当前项目打包成maven依赖:
    在这里插入图片描述

  • 在4.1中服务提供者引入当前模块依赖:

            <dependency>
                <groupId>org.example</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
  • 在4.1中服务提供者删除与当前模块相同的依赖。

4.2.2 开启热部署
  • 在idea中打开(这里是idea2021.3.1)

    在这里插入图片描述
    在这里插入图片描述

4.3 消费模块——服务消费者

  • 老样子新建maven的module,名命为cloud-consumer-order80(其实新建SpringBoot项目一样)。

  • 依赖:

        <dependencies>
    
            <dependency>
                <groupId>org.example</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
    
        </dependencies>
    
  • yml配置 & 启动类

    server:
      port: 80
    
    spring:
      application:
        name: cloud-payment-consumer
    
    
  • 配置restTemplate

@Configuration
public class ApplicationContextConfig {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}
  • controller
@Slf4j
@RestController
@RequestMapping("/consumer")
public class OrderController {

    private static final String PAYMENT_URL = "http://localhost:8001";

    @Autowired
    private RestTemplate restTemplate;

    @PostMapping("/payment/create")
    public CommonResult create(@RequestBody Payment payment){
        return restTemplate.postForObject(PAYMENT_URL+"/payment/create" ,
                payment ,
                CommonResult.class);
    }

    @GetMapping("/payment/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id){
        return restTemplate.getForObject(PAYMENT_URL+"/payment/" + id ,
                CommonResult.class);
    }

}

4.4 总结

这样就通过RestTemplate完成的最基础的服务消费者调用服务生产者。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值