微服务的互相调用feign(二)

it2022-05-05  117

这次讲的是微服务的互相调用

前一章已经完成一个producer服务的注册,这次我们就创建一个消费者服务来调用这个生产服务. 因为前面已经添加了rest接口依赖,这里不做重复,创建 HelloResource .class,添加注解

@RestController @RequestMapping("/api") public class HelloResource { private final Logger log = LoggerFactory.getLogger(HelloResource.class); @GetMapping("/hello") public String getHello(@RequestParam String name){ return "hello"+name; }

这里有一个路径"api/hello"的接口,重新启动producer服务,

192.168.0.112:8001/api/hello?name=木须

得到

hello木须

说明接口成功没问题

新建一个springboot项目:app-consumer-1

添加依赖

<!--微服务依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!--远程调用服务 依赖 feignClient--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>

application.yml配置

#spring配置 spring: application: #应用名称(服务调用者) name: app-consumer-1 #服务器配置 server: #端口 port: 8002 #服务中心发现注册配置 eureka: client: #服务注册中心地址 service-url: defaultZone: http://${user.name}:${user.password}@192.168.0.112:8761/eureka user: name: admin password: admin_1

启动类加注解

@SpringBootApplication @EnableEurekaClient //@EnableDiscoveryClient作用差不多,但当注册中心选择eureka时,推荐使用@EnableEurekaClient public class AppConsumer1Application {

启动,注册成功后我们进行下面的

启动类加注解

@SpringBootApplication @EnableEurekaClient //@EnableDiscoveryClient作用差不多,但当注册中心选择eureka时,推荐使用@EnableEurekaClient @EnableFeignClients //开启调用的注解 public class AppConsumer1Application {

新建接口类 HelloClient

/** * feign远程调用接口 * FeignClient注解的name属性值要写服务提供者在注册中心注册的{[服务名称]} */ @FeignClient(name = "app-producer-1") public interface HelloClient { @GetMapping("/api/hello") public String getHello(@RequestParam(value = "name") String name); }

@FeignClient的name属性要是被调方服务名 新建类HelloResource.java

@RestController @RequestMapping("/api") public class HelloResource { private final HelloClient helloClient; //初始化HelloClient public HelloResource(HelloClient helloClient) { this.helloClient = helloClient; } @GetMapping("/helloworld/{name}") public String getHello(@PathVariable String name){ return helloClient.getHello(name); } }

启动运行,

192.168.0.112:8002/api/Helloworld/木须

得到

hello木须

即调用成功,

加强,强化

但是调用会由于一些原因导致调用失败,这是的状况很不友好,feign中有熔断机制,即调用失败会有另一种处理方式. application.yml

#spring配置 spring: application: #应用名称(服务调用者) name: app-consumer-1 #服务器配置 server: #端口 port: 8002 #服务中心发现注册配置 eureka: client: #服务注册中心地址 service-url: defaultZone: http://${user.name}:${user.password}@192.168.0.112:8761/eureka #feign远程调用配置 # 1.如果服务提供者服务部署在不同机器,由于网络等因素的原因导致一个或多个服务提供者无法被调用, # 或者全部的服务提供者节点大面积停止运行,那么服务消费者这时候就应该友好的进行熔断,并提示用户该服务调用不成功 返回优化处理后的友好信息。 # 2.熔断是服务消费者(客户端)主动与服务提供者(服务端)断开, # 3.一个完整的服务调用应该考虑熔断。 # 4.当提供者服务或提供者集群重新启动并注册到服务注册中心后,消费者服务会结束熔断,并且再次成功调用提服务供者的服务。 # feign: hystrix: #开启熔断 enabled: true

写一个类HelloClientImpl实现HelloClient

@Component //加入spring管理 public class HelloClientImpl implements HelloClient { /** * 远程调用失败,将会回调该方法,属于服务调用者{[熔断]} * @param name 名称 * @return 自定义返回信息 */ @Override public String getHello(String name) { return "this connection is failed!!!!"; } }

这里就做了友好提示,不是直接报错 HelloClient

/** * feign远程调用接口 * FeignClient注解的name属性值要写服务提供者在注册中心注册的{[服务名称]} * FeignClient注解的fallback属性值表示远程调用失败时的回调类 */ @FeignClient(name = "app-producer-1",fallback = HelloClientImpl.class) public interface HelloClient { @GetMapping("/api/hello") public String getHello(@RequestParam(value = "name") String name); }

添加fallback 属性,

这里讲的是没有添加权限认证时互相调用的,如果添加了权限认证,那么需要额外一些配置 springcloud中feign调用的权限认证,https://blog.csdn.net/weixin_44400390/article/details/98077653.


最新回复(0)