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

springcloud微服务 专栏收录该内容
7 篇文章 0 订阅

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

前一章已经完成一个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
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值