济阳县建设局网站,房地产销售新手入门知识,深圳航空网上值机选座,乐清网络平台Rest微服务工程搭建---学习笔记2/91、简单架构示意图2、创建Cloud-provider-payment8001 微服务提供者Module模块2.1. 建Module2.2. 改pom2.3. 写yml2.4. 主启动2.5. 业务类3、创建Cloud-consumer-order80 微服务消费者订单Module模块3.1. 建Module3.2. 改pom3.3. 写yml3.4. 主…
Rest微服务工程搭建---学习笔记2/91、简单架构示意图2、创建Cloud-provider-payment8001 微服务提供者Module模块2.1. 建Module2.2. 改pom2.3. 写yml2.4. 主启动2.5. 业务类3、创建Cloud-consumer-order80 微服务消费者订单Module模块3.1. 建Module3.2. 改pom3.3. 写yml3.4. 主启动3.5. 业务类4、工程重构4.1 新建一个 cloud-api-commons 子模块4.2 mvn跳过testmvc cleanmvn install1、简单架构示意图
两个模块一个是服务提供者模块另一个是服务消费者模块
2、创建Cloud-provider-payment8001 微服务提供者Module模块
2.1. 建Module 创建完成后回到父工程查看pom文件变化
?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.tigerhhzz.springcloud/groupIdartifactIdspringcloud2023/artifactIdversion1.0-SNAPSHOT/versionmodulesmoduleCloud-provider-payment8001/module/modulespackagingpom/packagingnameMaven/name!-- FIXME change it to the projects website --urlhttp://maven.apache.org//urlinceptionYear2001/inceptionYeardistributionManagementsiteidwebsite/idurlscp://webhost.company.com/www/website/url/site/distributionManagement!-- 统一管理jar包版本 --propertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.targetjunit.version4.13.2/junit.versionlog4j.version1.2.17/log4j.versionlombok.version1.18.26/lombok.versionmysql.version8.0.32/mysql.versiondruid.version1.2.16/druid.versionmybatis.spring.boot.version3.0.1/mybatis.spring.boot.version/properties!-- 1、只是声明依赖并不实际引入子项目按需声明使用的依赖 --!-- 2、子项目可以继承父项目的 version 和 scope --!-- 3、子项目若指定了 version 和 scope以子项目为准 --dependencyManagementdependencies!--spring boot 2.2.2--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion3.0.5/versiontypepom/typescopeimport/scope/dependency!--spring cloud Hoxton.SR1--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion2022.0.2/versiontypepom/typescopeimport/scope/dependency!--spring cloud alibaba 2.1.0.RELEASE--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2021.0.4.0/versiontypepom/typescopeimport/scope/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion${mysql.version}/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion${druid.version}/version/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion${mybatis.spring.boot.version}/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion${junit.version}/version/dependencydependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion${log4j.version}/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/versionoptionaltrue/optional/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationforktrue/forkaddResourcestrue/addResources/configuration/plugin/plugins/build/project
2.2. 改pom
修改本模块的pom文件如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdspringcloud2023/artifactIdgroupIdcom.tigerhhzz.springcloud/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdCloud-provider-payment8001/artifactIdpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupId!--这个和web要写到一块--artifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.10/version/dependency!--mysql-connector-java--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!--jdbc--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies/project2.3. 写yml
编写application.yml配置文件
server:port: 8001spring:application:name: cloud-provider-payment8001datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/springcloud-tigerhhzz?useUnicodetruecharacterEncodingutf-8useSSLfalseusername: rootpassword: 123456
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.dkf.springcloud.entities # 所有Entity 别名类所在包
热部署这里我使用的Jrebel插件。
2.4. 主启动
package com.tigerhhzz.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** author Administrator*/
SpringBootApplication
public class PaymentMain8001 {public static void main(String[] args){SpringApplication.run(PaymentMain8001.class, args);}
}2.5. 业务类
下面的常规操作
建表SQL
create table payment(id bigint(20) not null auto_increment comment ID,serial varchar(200) default ,PRIMARY KEY (id))ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8select * from payment;entities
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;Data //set/get方法
AllArgsConstructor //有参构造器
NoArgsConstructor //无参构造器
public class Payment implements Serializable {private long id;//数据库是bigintprivate String serial;
}通用结果返回类实体
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;//返回给前端的通用json数据串
Data //set/get方法
AllArgsConstructor //有参构造器
NoArgsConstructor //无参构造器
public class CommonResultT {private Integer code;private String message;private T data; //泛型对应类型的json数据//自定义两个参数的构造方法public CommonResult(Integer code, String message){this(code, message, null);}
}dao
Mapper // 是ibatis下面的注解 //Repositoty有时候会有问题
public interface PaymentDao {int create(Payment payment);Payment getPaymentById(Param(id) Long id);
}resource下创建mapper文件夹新建PaymentMapper.xml。在yml里有所有entity别名类所在包所有payment不用写全类名
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.tigerhhzz.springcloud.dao.PaymentDaoresultMap idBaseResultMap typecom.tigerhhzz.springcloud.entities.Paymentid columnid propertyid jdbcTypeBIGINT/id columnserial propertyserial jdbcTypeVARCHAR//resultMapinsert idcreate parameterTypePayment useGeneratedKeystrue keyPropertyidinsert into payment(serial) values (#{serial})/insertselect idgetPaymentById parameterTypeLong resultMapBaseResultMapselect * from payment where id #{id}/select
/mapperParam注解
service
public interface PaymentService {int create(Payment payment);Payment getPaymentById(Param(id) Long id);
}Service
public class PaymentServiceImpl implements PaymentService {Autowiredprivate PaymentDao paymentDao;Overridepublic int create(Payment payment) {return paymentDao.create(payment);}Overridepublic Payment getPaymentById(Long id) {return paymentDao.getPaymentById(id);}
}controller
RestController //必须是这个注解因为是模拟前后端分离的restful风格的请求要求每个方法返回 json
Slf4j
public class PaymentController {Resourceprivate PaymentService paymentService;PostMapping(value /payment/create)// 注意这里的 RequestBody 是必须要写的虽然 MVC可以自动封装参数成为对象// 但是当消费者项目调用它传参是 payment 整个实例对象传过来的 即Json数据因此需要写这个注解public CommonResult create(RequestBody Payment payment){int result paymentService.create(payment);log.info(****插入结果 result);if(result 0){return new CommonResult(200, 插入数据库成功, result);}return new CommonResult(444, 插入数据库失败, null);}GetMapping(value /payment/{id})public CommonResult getPaymentById(PathVariable(id)Long id){Payment result paymentService.getPaymentById(id);log.info(****查询结果 result);if(result ! null){return new CommonResult(200, 查询成功, result);}return new CommonResult(444, 没有对应id的记录, null);}
}启动8001模块
对应POST方式的请求要学会用POSTMAN工具 测试插入一条数据
微服务多了之后就使用run dashboard
不但编译有个别地方会报错启动也会报错但是测试两个接口都是没问题的推测启动报错是因为引入了下面才会引入的jar包目前不影响。
3、创建Cloud-consumer-order80 微服务消费者订单Module模块
3.1. 建Module 3.2. 改pom
修改本模块的pom文件如下
3.3. 写yml
编写application.yml配置文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdspringcloud2023/artifactIdgroupIdcom.tigerhhzz.springcloud/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdCloud-consumer-order80/artifactIdpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies/project3.4. 主启动
OrderMain80.java
package com.tigerhhzz.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class OrderMain80{public static void main(String[] args){SpringApplication.run(OrderMain80.class,args);}
}3.5. 业务类
entites包中的类也拷贝到本项目中
entities/CommonResult.java entities/Payment.java
配置RestTemplate ApplicationContextConfig 内容
package com.tigerhhzz.springcloud.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** author tigerhhzz* date 2023/4/8 22:52*/
Configuration
public class ApplicationContextConfig {Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();/*RestTemplate提供了多种便捷访问远程http服务的方法是一种简单便捷的访问restful服务模板类是spring提供的用于rest服务的客户端模板工具集*/}
}controller
package com.tigerhhzz.springcloud.controller;import com.tigerhhzz.springcloud.entities.CommonResult;
import com.tigerhhzz.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;RestController
Slf4j
public class OrderController {//远程调用的 地址public static final String PAYMENY_URL http://localhost:8001;Resourceprivate RestTemplate restTemplate;PostMapping(customer/payment/create)public CommonResultPayment create (Payment payment){return restTemplate.postForObject(PAYMENY_URL /payment/create,//请求地址payment,//请求参数CommonResult.class);//返回类型}GetMapping(customer/payment/{id})public CommonResultPayment getPaymentById(PathVariable(id)Long id){return restTemplate.getForObject(PAYMENY_URL /payment/ id,//请求地址CommonResult.class);//返回类型}
}
如果 runDashboard 控制台没有出来右上角搜索 即可
运用spring cloud框架基于spring boot构建微服务一般需要启动多个应用程序在idea开发工具中多个同时启动的应用
需要在RunDashboard运行仪表盘中可以更好的管理但有时候idea中的RunDashboard窗口没有显示出来也找不到直接的开启按钮
80调用8001服务测试成功 4、工程重构
将两个微服务模块中公共的部分例如实体类等放到新建的微服务公共模块中
上面 两个子项目有多次重复的 导入 jar和重复的 Entity 实体类。可以把 多余的部分加入到一个独立的模块中将这个模块打包并提供给需要使用的 module
4.1 新建一个 cloud-api-commons 子模块
将 entities 包里面的实体类放到这个子模块中也将 pom 文件中重复导入的 jar包放到这个新建的 模块的 pom 文件中。如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdspringcloud2023/artifactIdgroupIdcom.tigerhhzz.springcloud/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdCloud-api-commons/artifactIddependenciesdependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!-- 这个是新添加的之前没用到后面会用到。关于这个hutool 是个功能强大的工具包官网https://hutool.cn/ --dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.1.0/version/dependency/dependencies/project4.2 mvn跳过testmvc cleanmvn install
将此项目打包 install 到 maven仓库。
将 提供者 和 消费者 两个项目中的 entities 包删除并删除掉加入到 cloud-api-commons 模块的 依赖配置。 将 打包到 maven 仓库的 cloud-api-commons 模块引入到 提供者 和 消费者的 pom 文件中如下所示 !-- 引入自己定义的api通用包 --dependencygroupIdcom.tigerhhzz.springcloud/groupIdartifactIdCloud-api-commons/artifactIdversion1.0-SNAPSHOT/versionscopecompile/scope/dependencypost测试插入数据成功