微服务构建项目(三) Ribbon+restTemplate和openfeign实现远程调用的区别

一、Ribbon实现远程调用

服务消费者订单模块OrderService.java,用于远程调用服务提供者会员模块。

@RestController
@RequestMapping("/qianziw/order")
public class OrderService {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/order_to_member")
    public String orderToMember(){
        try{
            //http+服务提供者的服务名+方法映射
            String memberGetUserURL = "http://qianziw-member/qianziw/member/user";
            String memberResult = restTemplate.getForObject(memberGetUserURL+ "?userid=5", String.class);
            return "订单调用会员结果为:" + memberResult;
        }catch (Exception e){
            e.printStackTrace();
            return "查询失败";
        }
    }
}

会员提供者会员模块MemberService.java

@RestController
@RequestMapping("/qianziw/member")
public class MemberService {

    @Value("${server.port}")
    private String serverPort;
    /**
     * 会员服务提供的接口被订单服务调用
     * @param userid
     * @return
     */
    @RequestMapping("/user")
    public String getUser(Integer userid){
        return "千字文会员 user : " + userid + ",端口号:" + serverPort;
    }
}

Ribbon负责负载均衡,默认通过轮询算法,"qianziw-member"对应的服务,再拼接方法映射就形成了访问的地址,然后由restTemplate去远程访问。

openfeign实现了进一步的封装,使我们感觉就像在调用本地服务一样。

服务消费者新建一个接口MemberService.java,对应服务提供者会员模块。@FeignClient注解的值是服务提供者的服务名,下面的方法就是服务提供者的提供的方法。

@Component
@FeignClient(value = "qianziw-member")
public interface MemberService {

    @GetMapping(value = "/qianziw/member/user/")
    String getUser(@PathVariable("userid") Integer userid);
}

在访问的时候,直接调用本地接口的方法,即可达到远程调用的目的。OrderService为服务消费者调用本地接口方法实现远程访问服务提供者。

@RestController
@RequestMapping("/qianziw/order")
public class OrderService {
    
    @Autowired
    private MemberService memberService;

    @GetMapping("/order_to_member")
    public String orderToMember(){
        try{
            String memberResult = memberService.getUser(6);
            return "订单调用会员结果为:" + memberResult;
        }catch (Exception e){
            e.printStackTrace();
            return "查询失败";
        }
    }
}

当然别了忘在服务消费者的启动类上加上注解@EnableFeignClients,这个注解可以扫描所有带有@FeignClient的类。

简单总结一下,就是Ribbon+restTemplate实现的话我们就要知道服务提供者服务名和方法映射才能完成,但是openfeign的话可以使用已经配置的接口,给我们的感觉就像是在调用本地的方法一样简单。

 

posted @ 2020-12-06 12:35  折枝花满衣  阅读(763)  评论(0)    收藏  举报