这是尚硅谷2024Cloud教程的笔记,只是记录学习历程,方便自己以后查询。周阳老师讲的很好,给出原视频地址
对应1.Boot和Cloud选项,2.Cloud组件的停更,升级,替换,3.Base工程构建。
SpringBoot3.0开始,对于JDK的最低版本是JDK17,强制要求,从JDK8.x 到JDK17的转变。又因OracleJDK的协议,推荐使用OpenJDK。OpenJDK官网下载。在语法层面和OracleJDK没有区别,只是Oracle在OpenJDK上,加了一些额外的商业特性。日常使用,OpenJDK可以了。
Spring官网,对于SpringBoot3.0+的maven版本要求是3.6.3+。注意该组件的版本,会影响idea的版本,因为较高的Maven,在idea2021某个版本之前的版本无法使用,亲自踩坑/(ㄒoㄒ)/~~。可以使用3.6.3,对各个版本的boot和idea兼容新都不错。推荐,使用Maven3.6.3,但是为和老师,保持一致,故使用3.9.5。
MySQL8.x版本,推出于2018年,距今已有较长时间。在稳定性,社区活跃度等方面都不错,以及免费的特性,实际项目开发中有较多使用。
选择一个版本的Boot,查看Reference Doc,其中的Getting Started中的System Requirements有本版本下,对于jdk,maven,tomcat最低的版本要求。
因为,要选择不同的jdk,不同的maven,所以需要这些信息。甚至,高版本的maven还需要和更高版本的idea适配。
如果是新项目,直接上微服务,是Cloud版本决定,Boot版本。旧项目改造,是Boot版本决定Cloud版本,因为整体项目从boot2.7.x,升级到3.x的代价还是比较高的。在Spring官网,中有Cloud和与Boot的版本依赖关系。官网地址
SpringCloud
SpringCloud Alibaba
SpringCloud和SpringCloud Alibaba相互独立,都是微服务思想的具体实现的产物,相同点就是Spring官方,将Alibaba纳入到了其维护的项目中,不过alibaba也在维护,且alibaba版本会更快。因为毕竟是自己的产品,之后才会同步到Spring社区。
https://github.com/spring-projects/spring-boot/releases
Spring Boot 3.0 requires Java 17 as a minimum version. SpringBoot3.0对于JDK的最低版本要求是JDK17。
https://github.com/spring-cloud
SpringCloud的版本关系
Spring Cloud 采用了英国伦敦地铁站的名称来命名,并由地铁站名称字母A-Z依次类推的形式来发布迭代版本
SpringCloud是一个由许多子项目组成的综合项目,各子项目有不同的发布节奏。为了管理SpringCloud与各子项目的版本依赖关系,发布了一个清单,其中包括了某个SpringCloud版本对应的子项目版本。为了避免SpringCloud版本号与子项目版本号混淆,SpringCloud版本采用了名称而非版本号的命名,这些版本的名字采用了伦敦地铁站的名字,根据字母表的顺序来对应版本时间顺序。例如Angel是第一个版本, Brixton是第二个版本。
当SpringCloud的发布内容积累到临界点或者一个重大BUG被解决后,会发布一个"service releases"版本,简称SRX版本,比如Greenwich.SR2就是SpringCloud发布的Greenwich版本的第2个SRX版本。
但是从2020年开始,以2020.0.x的方式命名版本,解决了,令人无法理解的版本命名。
https://spring.io/projects/spring-cloud
https://spring.io/projects/spring-cloud-alibaba
注意,此方式无法看到最新版。有延后。
和老师保持一致,选择2020.x。
https://github.com/alibaba/spring-cloud-alibaba/releases
框架间的版本适配,请严格依照官网,或者GitHub。
SpringCloud和SpringBoot和SpringCloud Alibaba三者,制约关系。是Cloud版本决定,Boot版本。
下图是SpringCloudAlibaba - SpringCloud - SpringBoot的版本关系。
基础组件 | 版本 |
---|---|
JDK | Java17+ |
Maven | 3.9+ |
MySQL | 8.0+ |
Spring Cloud | 2023.0.0 |
Spring Boot | 3.2.0 |
Spring Cloud Alibaba | 2022.0.0.0-RC2 |
微服务架构就像搭积木,每个微服务都是一个零件一个积木,并使用这些积木零件组装出不同的形状,出来最后一个完整的物体。
微服务架构就是把一个大系统按业务功能分解成多个职责单一的小系统,每一个小模块尽量专一的只做一件事,并利用简单的方法使多个小系统相互协作,组成一个大系统再统一对外提供整体服务。
专注一单一责任小型功能模块为基础,并利用轻量化机制(通常为HTTP RESTFUL API)实现通信完成复杂业务搭建的一种架构思想。
方便程序员专注于业务逻辑的,由分布式思想落地的框架和一些中间件“有机结合”的产物。
Netflix OSS(Open Source System)
,是Netflix
公司开发的一套代码框架和库,SpringCloud Netflix
是在Netflix OSS
基础之上的封装。
更新版本没有什么大惊小怪的,但是本次更新却正式开启了Spring Cloud Netflix
体系的终结进程。Netflix
公司是目前微服务落地中最成功的公司。它开源了诸如Eureka
、Hystrix
、Zuul
、Feign
、Ribbon
等等广大开发者所知微服务套件,统称为Netflix OSS
。在当时 Netflix OSS成为微服务组件上事实的标准。但是微服务兴起不久,也就是在2018年前后Netflix
公司宣布其核心组件Eureka
、Hystrix
、Zuul
、Feign
、Ribbon
等进入维护状态,不再进行新特性开发,只修BUG。
这直接影响了Spring Cloud项目的发展路线,Spring官方不得不采取了应对措施,在2019年的在SpringOne2019
大会中,Spring Cloud
宣布 Spring Cloud Netflix
项目进入维护模式,并在2020年移除相关的Netflix OSS
组件。
2019年进入Maintenance Mode。
维护模式
,就是被动的修复bugs,不再接收合并请求,不再发布新版本。换句话说就是,除非出现特别严重的bug,否则没人管了。
红叉:不能再使用了;感叹号:能用但是不推荐;对号:推荐使用。
备注,remove的组件都不能使用。
约定,业内基本达成共识的一些想法,比如在Web开发中,Post请求,往往用来添加数据,Get请求,用来获取数据,Delete请求,用来删除数据等。
配置,是提前确定好,使用的组件的版本信息,因为版本冲突的问题,导致的配置,是让人特别厌恶和反感的。这也是一般微服务项目,都会有一个公共的父模块,在这个父模块的pom文件中,定义好使用的各种框架,组建的版本。各个子模块,在自己的pom文件中,使用定义好的版本的依赖。
编码,就是写代码。
略,注意,创建父工程时,不要使用Spring的初始化工具,创建Maven项目。
com.atguigu.cloud
cloud
1.0-SNAPSHOT
File -> Settings -> Editor -> File Encodings
设置Global Encoding,Project Encoding,Default encoding for properties files 都为UTF-8,以及勾选Transparent native-to-ascii conversion。
File -> Settings -> Build,Execution,Deployment -> Complier -> Annotation Processors
Enable annotation processing勾选。
File -> Settings -> Build,Execution,Deployment -> Complier -> Java Complie
Target bytecode version选择17
File -> Settings -> Editor -> File Types
Ignored FIles and Folders
添加*.idea文件
以上配置,都可以配置在新创建项目中,也就是说新建的项目,会自动使用,配置好的。
File -> New Project Setup -> Settings for New Projects
这也是父工程存在的意义,提前定义好,本系统中,可能会使用的依赖的版本,防止,因版本冲突问题出现bug。注意,这里实际不引入jar包,只是定义版本。
4.0.0
com.atguigu.cloud
mscloudV5
1.0-SNAPSHOT
pom
17
17
UTF-8
5.8.22
1.18.26
1.1.20
3.0.2
8.0.11
2.2.0
4.2.3
2.0.40
1.0.2
3.1.5
3.2.0
2023.0.0
2022.0.0.0-RC2
org.springframework.boot
spring-boot-starter-parent
${spring.boot.version}
pom
import
org.springframework.cloud
spring-cloud-dependencies
${spring.cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring.cloud.alibaba.version}
pom
import
org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis.springboot.version}
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid-spring-boot-starter
${druid.version}
tk.mybatis
mapper
${mapper.version}
javax.persistence
persistence-api
${persistence-api.version}
com.alibaba.fastjson2
fastjson2
${fastjson2.version}
org.springdoc
springdoc-openapi-starter-webmvc-ui
${swagger3.version}
cn.hutool
hutool-all
${hutool.version}
org.projectlombok
lombok
${lombok.version}
true
org.springframework.boot
spring-boot-starter-test
${spring.boot.test.version}
test
Maven中的dependencyManagement和dependencies。
Maven 使用dependencyManagement
元素来提供了一种管理依赖版本号的方式。
通常会在一个组织或者项目的最顶层的父POM
中看到dependencyManagement
元素。
使用pom.xml
中的dependencyManagement
元素能让所有在子项目中引用一个依赖而不用显式的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagemen
t元素的项目,然后它就会使用这个dependencyManagemen
元素中指定的版本号。
这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,优势:
dependencyManagement
里只是声明依,并不实现引入,因此子项目需要显示的声明需要用的依赖。
如果不在子项目中声明依赖,是不会从父项目中继承下来的,只有在子项目中写了该依赖项并且没有指定具体版本,才会从父项目中继承该项 且version和scope都读取自父pom
;
如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
Maven中跳过单元测试
1.配置
org.apache.maven.plugins
maven-surefire-plugin
true
2.IDEA工具支持(推荐)
# mysql5.7---JDBC四件套
jdbc.driverClass = com.mysql.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3306/db2024?useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.user = root
jdbc.password =123456
# Maven的POM文件处理
mysql
mysql-connector-java
5.1.47
推荐使用MySQL8.0
# mysql8.0---JDBC四件套
jdbc.driverClass = com.mysql.cj.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
jdbc.user = root
jdbc.password =123456
# Maven的POM
mysql
mysql-connector-java
8.0.11
一款生成mapper的插件。
https://github.com/abel533/Mapper
https://github.com/mybatis-generator/mapper
#注意,只提供了建表sql,要自己建立数据库。演示sql,无实际意义。
DROP TABLE IF EXISTS `t_pay`;
CREATE TABLE `t_pay` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`pay_no` VARCHAR(50) NOT NULL COMMENT '支付流水号',
`order_no` VARCHAR(50) NOT NULL COMMENT '订单流水号',
`user_id` INT(10) DEFAULT '1' COMMENT '用户账号ID',
`amount` DECIMAL(8,2) NOT NULL DEFAULT '9.9' COMMENT '交易金额',
`deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='支付交易表';
INSERT INTO t_pay(pay_no,order_no) VALUES('pay17203699','6544bafb424a');
SELECT * FROM t_pay;
略
4.0.0
com.atguigu.cloud
mscloudV5
1.0-SNAPSHOT
mybatis_generator2024
17
17
UTF-8
org.mybatis
mybatis
3.5.13
org.mybatis.generator
mybatis-generator-core
1.4.2
tk.mybatis
mapper
mysql
mysql-connector-java
javax.persistence
persistence-api
cn.hutool
hutool-all
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
${basedir}/src/main/java
**/*.xml
${basedir}/src/main/resources
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
org.mybatis.generator
mybatis-generator-maven-plugin
1.4.2
${basedir}/src/main/resources/generatorConfig.xml
true
true
mysql
mysql-connector-java
8.0.33
tk.mybatis
mapper
4.2.3
resource文件夹下
config.properties
#User表包名
package.name=com.atguigu.cloud
# mysql5.7
jdbc.driverClass = com.mysql.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3306/db2024?useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.user = root
jdbc.password =123456
#或
#t_pay表包名
package.name=com.atguigu.cloud
# mysql8.0
jdbc.driverClass = com.mysql.cj.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
jdbc.user = root
jdbc.password =123456
generatorConfig.xml
cloud-provider-payment8001为例
建module
略,创建完成后,父工程pom文件会多一个
generator
cloud-provider-payment8001
改POM
4.0.0
com.atguigu.cloud
mscloudV5
1.0-SNAPSHOT
cloud-provider-payment8001
17
17
UTF-8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
com.alibaba
druid-spring-boot-starter
org.springdoc
springdoc-openapi-starter-webmvc-ui
org.mybatis.spring.boot
mybatis-spring-boot-starter
mysql
mysql-connector-java
javax.persistence
persistence-api
tk.mybatis
mapper
cn.hutool
hutool-all
com.alibaba.fastjson2
fastjson2
org.projectlombok
lombok
1.18.28
provided
org.springframework.boot
spring-boot-starter-test
test
写yml
server:
port: 8001
# ==========applicationName + druid-mysql8 driver===================
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
#连接的url替换为自己安装的端口好,和数据库
url: jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
username: xxx 替换为自己账号
password: xxx 替换为自己密码
# ========================mybatis===================
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.atguigu.cloud.entities
configuration:
map-underscore-to-camel-case: true
主启动
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;
/**
* @auther zzyy
* @create 2023-11-03 17:54
*/
@SpringBootApplication
@MapperScan("com.atguigu.cloud.mapper") //import tk.mybatis.spring.annotation.MapperScan;
public class Main8001
{
public static void main(String[] args)
{
SpringApplication.run(Main8001.class,args);
}
}
业务类
略
Swagger3常用注解
注解 | 标注位置 | 作用 |
---|---|---|
@Tag | Contoller类 | 标识Controller |
@Paramter | 参数 | 标识参数 |
@Paramters | 参数 | 参数多重说明 |
@Schema | Model层的JavaBean或DTO | 描述模型作用及每个属性 |
@Operation | 方法 | 描述方法作用 |
@ApiResponse | 方法 | 描述响应状态码 |
举例
@Tag(name = "支付微服务模块", description = "支付CRUD")
public class PayController {
@Operation(summary = "新增", description = "新增支付流水方法,json串做参数")
public ResultData addPay(@RequestBody Pay pay) {
@Schema(title = "支付交易表Entity")
public class Pay {
/**
* 订单流水号
*/
@Schema(title = "订单流水号")
private String orderNo;
配置类
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @auther zzyy
* @create 2023-11-04 10:40
*/
@Configuration
public class Swagger3Config
{
@Bean
public GroupedOpenApi PayApi()
{
return GroupedOpenApi.builder().group("支付微服务模块").pathsToMatch("/pay/**").build();
}
@Bean
public GroupedOpenApi OtherApi()
{
return GroupedOpenApi.builder().group("其它微服务模块").pathsToMatch("/other/**", "/others").build();
}
/*@Bean
public GroupedOpenApi CustomerApi()
{
return GroupedOpenApi.builder().group("客户微服务模块").pathsToMatch("/customer/**", "/customers").build();
}*/
@Bean
public OpenAPI docsOpenApi()
{
return new OpenAPI()
.info(new Info().title("cloud2024")
.description("通用设计rest")
.version("v1.0"))
.externalDocs(new ExternalDocumentation()
.description("www.atguigu.com")
.url("https://yiyan.baidu.com/"));
}
}
1.时间格式
返回的时间格式不是yyyy-MM-dd HH:mm:ss
2.统一设计API接口实现统一格式返回
3 全局异常接入返回的标准格式
1.使用@JsonFormat
注解
/**
* 创建时间
*/
@Column(name = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GBT+8")
private Date createTime;
/**
* 更新时间
*/
@Column(name = "update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GBT+8")
private Date updateTime;
2.Spring Boot
项目,也可以在application.yml文件中指定:
#建议使用该方式
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
思路:定义返回标准格式,三大标配:
扩展:接口调用时间:
新建枚举类
import java.util.Arrays;
public enum ReturnCodeEnum {
/**
* 操作失败
**/
RC999("999", "操作XXX失败"),
/**
* 操作成功
**/
RC200("200", "success"),
/**
* 服务降级
**/
RC201("201", "服务开启降级保护,请稍后再试!"),
/**
* 热点参数限流
**/
RC202("202", "热点参数限流,请稍后再试!"),
/**
* 系统规则不满足
**/
RC203("203", "系统规则不满足要求,请稍后再试!"),
/**
* 授权规则不通过
**/
RC204("204", "授权规则不通过,请稍后再试!"),
/**
* access_denied
**/
RC403("403", "无访问权限,请联系管理员授予权限"),
/**
* access_denied
**/
RC401("401", "匿名用户访问无权限资源时的异常"),
RC404("404", "404页面找不到的异常"),
/**
* 服务异常
**/
RC500("500", "系统异常,请稍后重试"),
RC375("375", "数学运算异常,请稍后重试"),
INVALID_TOKEN("2001", "访问令牌不合法"),
ACCESS_DENIED("2003", "没有权限访问该资源"),
CLIENT_AUTHENTICATION_FAILED("1001", "客户端认证失败"),
USERNAME_OR_PASSWORD_ERROR("1002", "用户名或密码错误"),
BUSINESS_ERROR("1004", "业务逻辑异常"),
UNSUPPORTED_GRANT_TYPE("1003", "不支持的认证模式");
private final String code;
private final String message;
ReturnCodeEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
public static ReturnCodeEnum getReturnCodeEnum(String code) {
for (ReturnCodeEnum rce : ReturnCodeEnum.values()) {
if (rce.getCode().equals(code)) {
return rce;
}
}
return null;
}
public static ReturnCodeEnum getReturnCodeEnumV2(String code) {
return Arrays.stream(ReturnCodeEnum.values())
.filter(r -> r.getCode().equals(code))
.findFirst()
.orElse(null);
}
}
新建统一定义返回对象ResultData
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class ResultData {
private String code;
private String message;
private T data;
private long timestamp;
public ResultData(){
this.timestamp = System.currentTimeMillis();
}
public static ResultData success(T data){
ResultData resultData = new ResultData();
resultData.setCode(ReturnCodeEnum.RC200.getCode());
resultData.setMessage(ReturnCodeEnum.RC200.getMessage());
resultData.setData(data);
return resultData;
}
public static ResultData fail(String code,String message){
ResultData resultData = new ResultData();
resultData.setCode(code);
resultData.setMessage(message);
return resultData;
}
}
修改PayController
略
测试
略
新建全局异常类
import com.atguigu.cloud.resp.ResultData;
import com.atguigu.cloud.resp.ReturnCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 默认全局异常处理
* @param e
* @return
*/
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResultData exception(Exception e) {
logger.error("----come in GlobalExceptionHandler");
log.error("全局异常信息exception:{}", e.getMessage(), e);
return ResultData.fail(ReturnCodeEnum.RC500.getCode(),e.getMessage());
}
}
修改Controller
略
不过,80端口,是HTTP协议的默认端口,一般开启浏览器,都会占用,所以修改为其他的端口即可,这里模块名未做修改。
这里,建moudle,改pom,写yml,主启动,业务类,都略,只是记笔记,不能再将编码,都重复一变,见视频
记一下,其中的核心的东西
新建立了PayDTO,用以微服务间的数据传输的载体。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author 长名06
* @year 2024
* 一般而言,调用者不应该获悉服务提供者的entity资源并知道表结构关系,所以服务提供方给出的
* 接口文档都都应成为DTO
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PayDTO implements Serializable {
private Integer id;
/**
* 支付流水号
*/
private String payNo;
/**
* 订单流水号
*/
private String orderNo;
/**
* 用户账号ID
*/
private Integer userId;
/**
* 交易金额
*/
private BigDecimal amount;
}
RestTemplate提供了多种便捷访问远程Http服务的方法, 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集。
restful可以看作是一种构建思想,也可以看作,标记服务器资源的协议(约定可能更合适)。比如Post接口,一般都是新增,Get接口,是查询等,都是Restful的体现。
使用restTemplate访问restful接口非常的简单粗暴无脑。
(url, requestMap, ResponseBean.class)这三个参数分别代表
REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
具体见官网API说明,这些东西,记不住,也正常。毕竟在计算机的世界里,要学的东西实在是太多了,学东西重要的是理解其思想。记不住就找笔记,或百度,问生成式AI都可以。
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
import com.atguigu.cloud.dto.PayDTO;
import com.atguigu.cloud.resp.ResultData;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/consumer")
public class OrderController {
public static final String PAYMENT_SRV_URL = "http://localhost:8001";//硬编码
@Resource
private RestTemplate restTemplate;
/**
* 一般情况下,通过浏览器的地址栏输入url,发送的只能是get请求
* 我们底层调用的是post方法,模拟消费者发送get请求,客户端消费者
* 参数可以不添加@RequestBody
* @param payDTO
* @return
*/
@GetMapping("/pay/add")
public ResultData addOrder(PayDTO payDTO){
return restTemplate.postForObject(PAYMENT_SRV_URL + "/pay/add",payDTO,ResultData.class);
}
@GetMapping("/pay/get/{id}")
public ResultData getPayInfo(@PathVariable("id") Integer id){
return restTemplate.getForObject(PAYMENT_SRV_URL + "/pay/get/" + id,ResultData.class,id);
}
@DeleteMapping("/pay/delete/{id}")
public void deletePay(@PathVariable("id") Integer id){
restTemplate.delete(PAYMENT_SRV_URL + "/pay/delete/"+id);
}
@GetMapping("/pay/update")
public void updatePay(PayDTO payDTO){
restTemplate.put(PAYMENT_SRV_URL + "/pay/update",payDTO);
}
}
测试略
将PayDTO
,ResultData
,ReturnCodeEnum
类提到common模块,打包到本地库,以及修改Order80,Pay8001的类和POM的修改,这些都略。
微服务所在的IP地址和端口号硬编码到订单微服务中,会存在非常多的问题
所以,在微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现,从此刻开始我们正式进入SpringCloud
实战。
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。
参与评论
手机查看
返回顶部