微服务的feign使用

本文探讨了Feign在SpringCloud微服务架构中的作用,包括其作为HTTP客户端的功能、负载均衡及熔断机制。通过具体案例,详细分析了使用Feign进行物流订单资源释放时遇到的问题及其解决过程,强调了日志在问题排查中的关键作用。

在微服务spring cloud中为什么使用feign?
1,可以直接用浏览器访问,是一个伪http客户端。
2,可以实现负载均衡,一个挂掉了,另一个可以继续用
3,熔断功能,比如发现A服务挂掉,就会立马返回失败信息
不用设置超时,不用配置。不会造成并发等待。

当我在做物流订单释放资源时,使用了feign,当订单删除时,应该释放本平台订单号。

/**
	 * 删除物流订单
	 * @param env
	 * @param id
	 * @throws Exception
	 */
	@Override
	public void delete(ClientEnvironment env, String order_id) throws Exception {
		// 系统当前时间
		Date day = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		UFDateTime ufDateTime = new UFDateTime(df.format(day));
		// 获取当前用户
		String name = env.getCurrUser().getEnterprise_name();
		OrderLogisticsVO vo = (OrderLogisticsVO) dao.findByPrimaryKey(OrderLogisticsVO.class, order_id);
		vo.setModified_time(ufDateTime);
		vo.setModifier(name);
		this.beforeDelete(env, OrderLogisticsVO.class);
		dao.deleteByPK(OrderLogisticsVO.class, order_id);
		// 判断货源是否本平台订单
		if(vo.getIs_platform_order() != 2) {
			return;
		}
		iOrdercenterService.releaseOrder(vo.getIs_order_type(), vo.getOrder_code());
	}

但是每次我删除订单以后,订单号并没有清空为null。然后我就去看了我的sql’语句

/**
	 * 物流释放订单
	 * 
	 * @param is_order_type 订单类型 1: 挂牌 2:竞价
	 * @param order_code    订单编码
	 */
	@Override
	public void releaseOrder(Integer is_order_type, String order_code) throws Exception {
		dao.getParams().add(order_code);
		// 判断是挂牌还是竞价
		if (is_order_type == 1) {
			dao.executeUpdate(" update li_order_center set source_id = null where order_code = ? ");
		}
		if (is_order_type == 2) {
			dao.executeUpdate(" update li_order_price set source_id = null where order_code = ? ");
		}
	}

检查一遍觉得updat语句没有问题。接下来就去检查了查询语句,

String sql = "select * from li_order_center where order_state = 3 and dr = 0 and (source_id is null or source_id ='' ) and ((sales_unit_id=? and sales_corp_code like ?)or(bug_customer_id =? and buyer_corp_code like ?))";

接下来去看日志

**update li_order_center set source_id = null where order_code ='WLD20190808008' ");**
执行耗时:1毫秒
2019-08-12 11:31:58.511 INFO  [http-nio-8087-exec-3] [et.common.dao.impl.SuperDAOImpl] [(execute:367)] - 符合条件的记录数为:0

看见日志后发现sql没执行,我就以为是事务回滚了。找了半天的rollback。
后来去数据库运行了sql,才发现order_code是物流订单编码, 应该是挂牌或竞价的编码
最后把order_code改成存储订单编码的字段make_order_num。就释放成功了!

iOrdercenterService.releaseOrder(vo.getIs_order_type(), vo.getMake_order_num());

一定要根据日志排查问题,不要乱猜测。

### 微服务Feign使用方法与示例 #### 什么是 FeignFeign 是一种声明式的 Web Service 客户端工具,它使得编写 HTTP API 调用变得更加简单。开发者只需创建一个接口并加上注解即可完成对远程服务的调用。 --- #### 配置与实现步骤 ##### 1. 添加依赖 在 `pom.xml` 文件中引入 Feign 的相关依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 此依赖用于支持 OpenFeign 功能[^2]。 --- ##### 2. 启用 Feign 支持 在项目的启动类上添加 `@EnableFeignClients` 注解来启用 Feign 客户端功能: ```java @SpringBootApplication @EnableFeignClients public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- ##### 3. 创建 Feign 接口 定义一个 Feign 接口,在其中通过 `@FeignClient` 注解指定目标微服务名称以及对应的 URL 地址: ```java @FeignClient(name = "article-service", url = "http://localhost:8081") public interface ArticleServiceClient { @GetMapping("/articles/{id}") String getArticleById(@PathVariable("id") Long id); @PostMapping("/articles") ResponseEntity<String> createArticle(@RequestBody Article article); } ``` 上述代码表示该客户端会调用名为 `article-service` 的微服务,并提供了两个方法分别用于获取文章详情和创建新文章。 --- ##### 4. 在其他模块中使用 Feign 接口 假设有一个 `wemedia` 模块需要调用 `article` 模块中的某些操作,则可以在其控制器或其他组件中直接注入前面定义好的 Feign 接口实例: ```java @RestController @RequestMapping("/media/articles") public class MediaController { private final ArticleServiceClient articleServiceClient; @Autowired public MediaController(ArticleServiceClient articleServiceClient) { this.articleServiceClient = articleServiceClient; } @GetMapping("/{id}") public String fetchArticleDetails(@PathVariable("id") Long id){ return articleServiceClient.getArticleById(id); } @PostMapping("/") public ResponseEntity<String> publishNewArticle(@RequestBody Article newArticle){ return articleServiceClient.createArticle(newArticle); } } ``` 这里展示了如何通过注入的方式轻松访问另一个微服务的数据资源。 --- ##### 5. 用户信息传递解决方案 针对微服务间用户信息传递的问题,可以借助网关统一管理认证授权流程,并将必要的上下文参数附加到后续请求头当中去。这样做的好处是可以减少重复开发工作量的同时也增强了系统的安全性[^3]。 另外还可以自定义拦截器来自动为每次发出的请求添加特定头部字段或者查询字符串参数。例如下面这个例子展示的是怎样设置全局 token 参数: ```java @Component public class CustomRequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { // 假设当前线程持有有效的JWT令牌 String jwtToken = (String) SecurityContextHolder.getContext().getAuthentication().getCredentials(); if(jwtToken != null && !jwtToken.isEmpty()){ template.header("Authorization","Bearer "+jwtToken ); } } } ``` 这段代码片段实现了对于每一个经由OpenFeign发起出去的HTTP请求都会附带相应的认证凭证[^4]。 --- #### 总结 综上所述,Feign 提供了一种简洁优雅的方式来简化分布式系统内部各部分之间的通信过程。通过对它的合理配置与运用能够极大地提升项目可维护性和运行效率[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值