最近用SpringCloud作微服务,一直没法成功进行服务消费。
我使用的服务消费者是Feign,声明式调用服务提供者。spring
1.检查服务提供者:
(1)对提供的方法进行测试,确保提供的服务没有问题。
(2)是否在控制层上方添加了@Controller。
(3)方法的method是否正确。是GET仍是POST。
2.仔细检查服务消费者:
(1)服务名value是否正确。服务名不必定是项目名,要检查服务提供者的application配置文件,对应的spring.application.name属性,也能够直接打开注册中心查看服务名。
(2)是否存在上下文。要检查服务提供者的application配置文件,是否有 context-path 属性。若是存在上下文属性,要加到方法参数value的前面 。
(3)方法的method是否正确。是GET仍是POST。
(4)方法的url是否正确。对应服务提供者的url。
3.检查断路由Hystrix:
(1)在类的上方是否加了@Component
4.检查是在哪一个环境下操做:
若是本地环境的程序没有关闭,就对部署在开发环境中的服务发起消费请求,可能会失败。app
服务提供者,服务名为invoice,以下:ide
@Controller public class InvoiceMsgController extends BaseController{ private static final Logger logger=LoggerFactory.getLogger(InvoiceMsgController.class); @Autowired private SendMsgService sendMsgService; /** * 服务提供者的方法 */ @RequestMapping(value = "/sentMsg", method = RequestMethod.POST ) public void sentMsgToWeChat(HttpServletRequest request) throws Exception { // 从请求中获取sendJson等其余逻辑忽略 sendMsgService.SendWechatMessage(sendJson); logger.info("==============>成功推送我的号消息。"); } }
服务提供者的yml配置文件:微服务
server: port: 10010 context-path: /dev spring: application: name: invoice
服务消费者Feign,调用的服务提供者名称为invoice,以下:测试
@FeignClient(value="invoice",fallback=InvoiceMsgHystrix.class) public interface InvoiceMsgService { /** * 调用服务提供者中的方法。 * 注意:此处的/dev 是invoice服务的上下文,相关的properties配置为: server.context-path=/dev。若是服务提供者有上下文,就要加在Feign的value里面。没有则不加。 */ @RequestMapping(value = "/dev/sentMsg", method = RequestMethod.POST) JSONObject sentMsgToWeChat(JSONObject invoiceJson) ; }
服务熔断以下:url
/** * 断路由 * */ @Component public class InvoiceMsgHystrix implements InvoiceMsgService{ private JSONObject createObject(){ JSONObject object=new JSONObject(); object.put("errcode", "0001"); object.put("description", "发送消息失败"); return object; } @Override public JSONObject sentMsgToWeChat(JSONObject request) { // TODO Auto-generated method stub return createObject(); } }