微服务构建项目(三) 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的话可以使用已经配置的接口,给我们的感觉就像是在调用本地的方法一样简单。
浙公网安备 33010602011771号