开发辅助一(网关gateway+ThreadLocal封装用户信息+远程调用+读取配置文件+统一异常处理)

网关gateway模块

①、配置文件,添加各个服务模块的路由路径

yml 复制代码
gateway:
	routes:
		-id: server-cart #微服务名称
		uri: lb://service-cart  #负责均衡
		predicates:
			- Path=/api/order/cart/**

ThreadLocal

①、定义一个工具类

java 复制代码
public class AuthContextUtil{
	
	private static final ThreadLocal<SysUser> threadLocal = new ThreadLocal<>();

	//存储数据
	public static void set(SysUser sysUser){
		threadLocal.set(sysUser);
	}
	
	//获取数据
	public static SysUser get(){
		return threadLocal.get();
	} 

	//删除数据
	public static void remove(){
		threadLocal.remove();
	}
}

②、业务方法中使用

java 复制代码
@GetMapping(value="/getUserInfo")
public Result getUserInfo(){
	return Result.build(AuthConextUtil.get(),ResultCodeEnum.SUCCESS); //从ThreadLocal中获取用户信息
}

远程调用

购物车服务模块------>商品服务模块中的数据

①、service-client模块将调用接口单独剥离出来作为调用接口端

添加依赖:spring-cloud-starter-openfeign spring-cloud-loadbalancer

创建远程调用接口

java 复制代码
@FeignClient(value="service-product") //value的值和service-product模块中配置文件服务名称一致
public interface ProductFeignClient{
	
	@GetMapping("/api/product/getBySkuId/{skuId}")
	public ProductSku getBySkuId(@PathVariable("skuId") Long skuId);
}

②、service-cart模块中引入service-client模块坐标

启动类上添加注解

java 复制代码
@EnableFeignClients(basePackages = {"com.michael.spzx"})
@EnableUserLoginAuthInterceptor //该注解是针对ThreadLocal存入的用户信息
java 复制代码
@Autowired
private ProductFeignClient productFeignClient;//将接口进行注入

//方法中,调用即可

③、service-product模块服务提供

service/mapper省略

java 复制代码
@GetMapping("/getbySkuId/{skuId}")
public ProductSku getBySkuId(@PathVariable Long skuId){
	ProductSku productSku = productService.getBySkuId(skuId);
	return productSku;
}

读取配置文件

①、配置文件

配置文件的相互导入

application-alipay.yml

yml 复制代码
spzx:
	applipay:  #值省略
		allipay_url: 
		app_id: 
		app_private_key: 
		return_payment_url:
		notify_payment_url:

application-dev.yml中进行引入

yml 复制代码
spring:
	config:
		import: application-alipay.yml

②、定义实体类读取配置文件

java 复制代码
@Data
@ConfigurationProperties(prefix="apzx.alipay")
public class AlipayProperties{
	
	private String alipayUrl; //属性名和配置文件中的保持一致
	private String appPrivateKey;
	public String alipayPublicKey;
	private String appId;
	public String returnPaymentUrl;
	public String notifyPaymentUrl;

	public final static String format="json";
	public final static String charset="utf-8";
	public final static String sign_type="RSA2"
}

③、启动类添加注解

java 复制代码
@EnableConfigurationProperties(value={AlipayProperties.class})

统一异常

①、创建异常定义

java 复制代码
@ControllerAdvice //给Controller增加一个统一操作
public class GlobalExceptionHandler{
	
	//全局异常处理
	@ExceptionHandler(Exception.class)
	@ResponseBody
	public Result error(){
		return Result.build(null,ResultCodeEnum,SYSTEM_ERROR);
	}

	//引入自定义异常
	@ExceptionHandler(GuiGuException.class)
	@ResponseBody
	public Result error(GuiguException e){
		return Result.build(null,e.getResultCodeEnum());
	}
}
java 复制代码
/**
	自定义异常
*/
@Data
public class GuiguException extends RuntimeException{
	
	private Integer code;
	private String message;

	private ResultCodeEnum resultCodeEnum; //枚举类封装的错误状态码和错误信息

	public GuiguExcetion(ResultCodeEnum resultCodeEnum){
		this.resultCodeEnum = resultCodeEnum;
		this.code = resultCodeEnum.getCode;
		this.message = resultCodeEnum.getMessage();
	}

	public GuiguExcetion(Integer code,String message){
		this.code = code;
		this.message = message;
	}
}

②、Service业务类使用

java 复制代码
if(sysUser == null){
	//throw new RuntimeException("用户名或密码错误");
	//改成自定义异常
	throw new GuiguException(ResultCodeEnum.LOGIN_ERROR);
}
相关推荐
hggngx548h14 分钟前
有哪些C++20特性可以在Dev-C++中使用?
开发语言·c++·c++20
2401_8414956425 分钟前
【自然语言处理】基于规则基句子边界检测算法
人工智能·python·自然语言处理·规则·文本·语言·句子边界检测算法
yue0081 小时前
C# 生成指定位数的编号
开发语言·c#
大笨象、小笨熊1 小时前
Qt Widgets和Qt Quick在开发工控触摸程序的选择
开发语言·qt
红黑色的圣西罗1 小时前
C# List.Sort方法总结
开发语言·c#
E_ICEBLUE2 小时前
Python 教程:如何快速在 PDF 中添加水印(文字、图片)
开发语言·python·pdf
我爱学习_zwj2 小时前
服务器接收用户注册信息教程
python
大连滚呢王2 小时前
Linux(麒麟)服务器离线安装单机Milvus向量库
linux·python·milvus·银河麒麟·milvus_cli
南方的狮子先生2 小时前
【C++】C++文件读写
java·开发语言·数据结构·c++·算法·1024程序员节