微服务:OpenFeign进行服务通讯时携带Token数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、OpenFeign是什么?

        Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务 一样简单, 只需要创建一个接口并添加一个注解即可。

        Nacos很好的兼容了Feign,Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。而且是集成的是Ribbon的轮询策略。

二、使用场景

        Figen主要的作用是发送Http请求的,Fiegn中携带Token到另一个服务去,需要配置一个Fegin的配置类完成此操作。

三、使用步骤

1.创建一个FeginClient的配置类

代码如下(示例):

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;

/**
 * @author : 胡浩
 * @version 1.0
 * @description: 描述
 * @date 2022/11/15 18:37
 */
@Configuration
public class FeignConfig implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        requestTemplate.header("token", request.getHeader("token"));
    }
}

2.在@FeginClient注解中添加Configuration属性

代码如下(示例):

import com.trkj.common.vo.AjaxResponse;
import com.trkj.config.FeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(value = "news-comment",configuration = FeignConfig.class)
public interface CommentService {
    @GetMapping("/comment/lookComment/{newsId}")
    AjaxResponse lookComment(@PathVariable("newsId") Integer newsId);
}

总结

        以上就是OpenFegin在服务之间通讯中,携带token的实现方法了。其实挺简单的,就两步。

最后,欧力给!!!

### 黑马微服务 Day1 登录功能实现教程 在黑马微服务课程的第一天,主要介绍了如何导入项目并为后续的微服务学习奠定基础[^1]。然而,关于登录功能的具体实现并未直接提及,但可以结合 Spring Cloud Gateway 的网关登录校验功能以及微服务之间的调用逻辑来推测其实现方式[^2]。 #### 1. 登录功能的基本架构 登录功能通常通过网关进行统一管理,Spring Cloud Gateway 提供了强大的过滤器功能,可以在请求到达具体微服务之前完成身份验证和权限校验。以下是一个典型的登录功能实现步骤: - **网关拦截器配置**:使用 Spring Cloud Gateway 的全局过滤器或自定义过滤器,对请求头中的用户信息(如 token)进行解析和校验。 - **微服务间调用**:如果需要调用其他微服务(如用户服务),可以通过 OpenFeign 实现远程调用,并确保请求头中携带必要的用户信息[^4]。 #### 2. 网关登录校验代码示例 以下是一个基于 Spring Cloud Gateway 的登录校验过滤器实现示例: ```java @Component public class AuthFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 获取请求头中的 token String token = exchange.getRequest().getHeaders().getFirst("Authorization"); if (StringUtils.isEmpty(token)) { return this.onError(exchange, "Missing Authorization header", HttpStatus.UNAUTHORIZED); } // 验证 token 是否有效 try { JwtUtil.parseToken(token); // 假设使用 JWT 格式 } catch (Exception e) { return this.onError(exchange, "Invalid token", HttpStatus.FORBIDDEN); } // 如果校验通过,继续处理请求 return chain.filter(exchange); } private Mono<Void> onError(ServerWebExchange exchange, String message, HttpStatus status) { ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(status); return response.setComplete(); } @Override public int getOrder() { return HIGHEST_PRECEDENCE; } } ``` #### 3. 微服务间调用的身份传递 在微服务之间调用,为了确保用户信息能够正确传递,可以使用 OpenFeign 并设置请求头。以下是一个示例: ```java @FeignClient(name = "user-service") public interface UserClient { @PostMapping("/users/authenticate") ResponseEntity<String> authenticate(@RequestHeader("Authorization") String token); } ``` 在调用方的服务中,可以通过以下方式调用 `UserClient`: ```java @Service public class AuthService { @Autowired private UserClient userClient; public void validateUser(String token) { ResponseEntity<String> response = userClient.authenticate(token); if (!response.getStatusCode().is2xxSuccessful()) { throw new RuntimeException("User authentication failed"); } } } ``` #### 4. 静态资源与 Nginx 配置 如果涉及到静态资源的访问,Nginx 的配置也非常重要。根据引用内容[^5],Nginx 可以通过 `upstream` 和 `location` 指令将请求转发到正确的服务端口。例如: ```nginx upstream heima-admin-gateway { server localhost:6001; } server { listen 8803; location / { root html/toutiao/admin-web/; index index.html; } location ~ /admin_gateway/(.*) { proxy_pass http://heima-admin-gateway/$1; proxy_set_header HOST $host; proxy_pass_request_body on; proxy_pass_request_headers on; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` 此配置确保静态资源请求能够正确路由到网关服务,同保留原始请求头中的用户信息。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值