尚硅谷—Cloud—微服务架构编码构建(5~14)

编程入门 行业动态 更新时间:2024-10-28 16:16:59

尚<a href=https://www.elefans.com/category/jswz/34/1770121.html style=硅谷—Cloud—微服务架构编码构建(5~14)"/>

尚硅谷—Cloud—微服务架构编码构建(5~14)

一:约定 > 配置 > 编码

二:IDEA 新建 Project 工作空间

             1)微服务 cloud 整体聚合父工程 Project(构建步骤)


                      a:New Project
                      b:聚合总父工程名字
                      c:Maven 选版本
                      d:工程名字
                      e:字符编码
                      f:注解生效激活
                      g:java 编译版本选择 8
                      h:File type 过滤(清爽的菜单)

             2)父工程 POM()
                      a:添加 聚合项目的标识。

                      b:删掉 自己创建的 SRC 工作目录。
                      c:pom

<?xml version="1.0" encoding="UTF-8"?><project xmlns=".0.0" xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><modelVersion>4.0.0</modelVersion><!--gav maven 坐标--><groupId>com.atguigu.springcloud</groupId><artifactId>cloud2020</artifactId><version>1.0-SNAPSHOT</version><modules><module>cloud-provider-payment-8001</module></modules><packaging>pom</packaging><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>8.0.18</mysql.version><druid.verison>1.1.16</druid.verison><mybatis.spring.boot.verison>1.3.0</mybatis.spring.boot.verison></properties><!--dependencyManagement :父类定义好后,子类可直接继承--><!--子模块继承之后,提供作用:锁定版本+子module,不用写groupId和version--><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><!-- MySql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- Druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.verison}</version></dependency><!-- mybatis-springboot整合 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.boot.verison}</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><!-- log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></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>


             3)Maven 工程落地 细节复习
                      a:Maven 中的 DependencyManagement 和 Dependencies。
                                - 这两个都很常见,尤其是 pom 父工程中。
                                - DependencyManagement:
                                           1. 通常会在 最顶层 父POM 中看到。
                                           2. 此元素 能让所有在子项目中,引用某个依赖时,不用显式的列出版本号。
                                           3. 好处:一次修改,处处生效。在 父 pom 文件里修改。 
                                           4. 只是声明依赖,定义,并不实现引入,因此:子项目需要显式的声明需要用到依赖,才会被真正的引用进来。
                                - Dependencies:
                                           1. 相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
                                           2. dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
                      b:Maven 中,跳过单元测试:


             4)父工程创建完成,执行 mvn:install ,将父工程发布到仓库,方便子工程继承。

 

三:Rest 微服务工程构件

             1)口诀(5步):建module、改POM、写YML、主启动、业务类。
             1)构建步骤:
                      a:cloud-provider-payment8001:微服务提供者支付 Model 模块:
                                - 建 module:

                                - POM 变化:

    //父 POM 里面引入了 子 module<modules><module>cloud-provider-payment-8001</module></modules><packaging>pom</packaging>//子 module 引入了 父 的依赖<parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent>

                                - 改 POM:

    <parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><!--gav:继承以后,不用再写groupid 和 vaersion--><artifactId>cloud-provider-payment-8001</artifactId><dependencies><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>com.alibaba</groupId><artifactId>druid-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-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>

                                - 写 YML

server:port: 8001spring:application:name: cloud-provider-payment-8001datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://114.215.173.88:3306/my_database?Unicode=true&characterEncoding=UTF-8&userSSL=falseusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcemybatis:mapper-locations: classpath:mybatis/mapper/*.xmltype-aliases-package: com.cloud

                                - 主启动

@MapperScan(basePackages = {"com.cloud.dao"})
@SpringBootApplication
public class MySpringBootStater {public static void main(String[] args) {SpringApplication.run(MySpringBootStater.class, args);}}

                                - 业务类
                                           1. 建库、建表 SQL:

CREATE TABLE `payment` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`serial` varchar(200) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

                                           2. entities:

@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 message;private T data;public CommonResult(Integer code, String message) {this.code = code;this.message = message;}
}

                                           3. dao:

@Mapper
public interface PaymentDao {int create(Payment payment);Payment getPayment(@Param(value = "id") Long id);}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ".dtd"><mapper namespace="com.cloud.dao.PaymentDao"><insert id="create" parameterType="payment" useGeneratedKeys="true" keyProperty="id">INSERT INTO payment (serial)VALUES (#{serial});</insert><resultMap id="baseResultMap" type="com.cloud.entities.Payment"><id column="id" property="id" jdbcType="BIGINT"></id><result column="serial" property="serial" jdbcType="VARCHAR"></result></resultMap><select id="getPayment" parameterType="long" resultMap="baseResultMap">select *from payment pwhere p.id = #{id};</select></mapper>
server:port: 8001spring:application:name: cloud-provider-payment-8001datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://114.215.173.88:3306/my_database?Unicode=true&characterEncoding=UTF-8&userSSL=falseusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcemybatis:mapper-locations: classpath:mybatis/mapper/*.xmltype-aliases-package: com.cloud

 

                                            4. service:

//粘 dao 的方法头,放到 service 接口中public interface PaymentService {public int create(Payment payment);public Payment getPayment(Long id);}@Service
public class PaymentServiceImpl implements PaymentService {@Autowiredprivate PaymentDao paymentDao;@Overridepublic int create(Payment payment) {int i = paymentDao.create(payment);return i;}@Overridepublic Payment getPayment(Long id) {Payment payment = paymentDao.getPayment(id);return payment;}
}

                                           5. controller:

@Slf4j
@RestController
public class PaymentController {@Autowiredprivate PaymentService paymentService;@PostMapping(value = "/create")public CommonResult create(@RequestBody Payment payment) {log.info("传入的数据为 :" + payment);int i = paymentService.create(payment);if (i > 0) {log.info("新增成功");return new CommonResult(200, "成功了", i);} else {log.info("新增失败");return new CommonResult(400, "插入数据失败");}}@GetMapping(value = "/getPayment")public CommonResult getPayment(@RequestParam(value = "id") Long id) {log.info("传入的数据为:" + id);Payment payment = paymentService.getPayment(id);if (payment != null) {log.info("查询成功");return new CommonResult(200, "成功:", payment.toString());} else {log.info("查询失败");return new CommonResult(400, id + "没找到");}}}

                                - 测试(项目多了之后用 Run Dashboard 界面操作程序)

//测试 1
localhost:8001/getPayment?id=1. get
{"code": 200,"message": "成功:","data": "Payment(id=1, serial=方法)"
}
------------------------------------
//测试 2
localhost:8001/create. post
{"serial":"李四"
}
{"code": 200,"message": "成功了","data": 1
}

                                - 小总结(建Module、改POM、写YML、主启动、业务类)

                      b:热部署 Devtools:(代码修改,自动重启,只可以开发阶段使用,生产删掉)
                                - 添加 devtools 

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency>

                                - 添加 plugin 到 pom.xml

    <build><!-- 可写可不写:自己工程的名称 --><finalName>cloud2020</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><addResources>true</addResources></configuration></plugin></plugins></build>

                                - 开启自动编译的选项

                                - 更新:build (绿的锤子)
ctrl + atl + shift + /:
                                - 重启 IDEA

                      c:cloud-consumer-order80:微服务消费者订单 Model 模块:
                                - 建module(cloud-consumer-order-80)

                                - 改 pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0"xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-consumer-order-80</artifactId><dependencies><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-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>

                                - 写 yml:

spring:application:name: cloud-consumer-order-80redis:port: 80

                                - 主启动:

@SpringBootApplication
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}

                                - 业务类:
                                              1. entities(PayEntiry、CommotResult)

@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 message;private T data;public CommonResult(Integer code, String message) {this.code = code;this.message = message;}
}

                                              2.首说 RestTemplate (封装 调用接口方式的 工具类 )

/*** 1 是什么:*   RestTemplate 提供了多种,便捷访问远程 HTTP 服务的方法。*    是一种,简单快捷的访问 restful 服务模版类,*    是 Spring 提供的 用于访问 Rest 服务的 客户端模版工具集。*//***  2 官网及使用:* *    使用:( url,requestMap,ResponseBean.class ) 这三个参数分别代表:*        REST 请求地址、请求参数、HTTP响应转换 被转换成的类型对象。* /

                                               3.Config 配置 RestTemplate

@Configuration
public class ApplicationContextConfig {@Beanpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}

                                               4.Controller 

@Slf4j
@RestController
public class OrderController {public static final String PAYMENT_URL = "http://localhost:8001";@Autowiredprivate RestTemplate restTemplate;/*** 调用 8001 ,进行支付*/@PostMapping(value = "/payment/create")public CommonResult<Payment> create(@RequestBody Payment payment) {log.info("传入的数据为 :" + payment);CommonResult<Payment> commonResult= restTemplate.postForObject(PAYMENT_URL + "/create", payment, CommonResult.class);log.info("远程调用 得到的数据为 : " + commonResult);return commonResult;}@GetMapping(value = "/getPayment/get")public CommonResult<Payment> getPayment(@RequestParam(value = "id") Long id) {log.info("传入的数据为 :" + id);CommonResult<Payment> paymentCommonResult= restTemplate.getForObject(PAYMENT_URL + "/getPayment?id=" + id, CommonResult.class);log.info("远程调用 得到的数据为 : " + paymentCommonResult);return paymentCommonResult;}}

                                - 测试:
                                           1.多项目启动,调整出 Run Dashboard(service):

                      d:工程重构:
                                - 观察问题:系统中有重复的部分,进行重构。
                                - 新建module:cloud-api-commons
                                - POM:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 糊涂工具包 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.1.0</version></dependency></dependencies></project>

                                - entities:
                                           1.将 entities.Payment 和 result.Common.Result 移动到 Common module 中。
                                - maven 命令 clean install:
                                - 订单 80 和 支付 8001 分别改造:然后测试
                                           1.将子 module 中的删除。
                                           2.改各自的 pom 文件,引入依赖。

        // 在 总 pom 中引入 common ,规定版本// 规定 引入 common 文件 的版本<dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency>// 子 module 引入 common 依赖(就不用写版本号了)<dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId></dependency>



             2)目前工程详图:

 

更多推荐

尚硅谷—Cloud—微服务架构编码构建(5~14)

本文发布于:2023-07-28 20:53:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1310294.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:硅谷   架构   Cloud

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!