第5.1.3 SpringCloud Feign初步

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/warrah/article/details/82752448

dubbo是基于rpc的,实现系统调用,客户端只需要加载接口就可以,服务端负责具体实践。系统与系统之间的调用,就像自己调用自己一样,这样就非常方便了。而通过Rest API,则需要发送http请求,然后解析响应结果,这样通用的一个流程,spring又如何会放过呢,
33.服务之间的调用之RPC、Restful深入理解,RPC的性能显然比Rest要高,而且开发也较为简单。于是springcloud 之 Feign Rpc就此诞生了。
问题是Feign并不是真的RPC,而是伪的,让你在编写代码的时候,看起来像是真的一样方便。
1 pom.xml

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

2 添加@EnableFeignClients
这个是添加在客户端的调用中

@SpringBootApplication
@ComponentScan(basePackages = {"com.dzmsoft"})
@MapperScan(basePackages = { "com.dzmsoft.userserver.base.dao" })
@EnableEurekaClient
@EnableFeignClients
@Slf4j
@EnableAutoConfiguration
public class UserServerApplication {
    public static void main(String[] args) {
        try {
            SpringApplication.run(UserServerApplication.class, args);
        }finally {
            log.info("server start finish");
        }
    }
}

3 客户端调用
gateway-auth是要提供api服务端的spring.application.name, 请求路径jwt/verify就是服务端提供的restapi。

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(value = "gateway-auth")
public interface ServiceAuthFeign {

    @GetMapping("jwt/verify")
    String getInfo(@RequestParam(value = "token") String token);

}

4 服务端的代码
服务端的代码并没有什么特别,就是不同的controller而已

@GetMapping("verify")
    public ResponseEntity<String> verify(@RequestParam(value = "token") String token) throws Exception{
        try {
            if(stringRedisTemplate.opsForValue().get(token)!=null){
                throw new UserTokenException("token失效,请重新登录");
            }
            IJWTInfo info = authService.validate(token);
            return ResponseEntity.ok(info.getId());
        } catch (ExpiredJwtException ex){
            throw new UserTokenException("User token expired!");
        }catch (SignatureException ex){
            throw new UserTokenException("User token signature error!");
        }catch (IllegalArgumentException ex){
            throw new UserTokenException("User token is null or empty!");
        }
    }

使用起来,就像上面那么简单。
杨恩雄的《疯狂Spring Cloud微服务架构实战》介绍Feign时,介绍了多种调用REST服务的方式,第一是CXF,CXF是一个webservice框架,那么webservice与REST有什么关系呢?
先了解一下webservice的发展历史,SOAP和WebService的那些事,现有了SOAP,这个协议是厂商之间协定的一个标准,再看看HTTP协议是由互联网工程工作小组制定的,所以可以想象SOAP的确夹杂着厂商的技术壁垒,而HTTP则不然。于是就发展出来了支持REST的webservice。

猜你喜欢

转载自blog.csdn.net/warrah/article/details/82752448