spring cloud nacos 服务提供、服务消费(Feign、RestTemplate)及Hystrix熔断设置

下载安装 Nacos 服务中心(下载地址 https://github.com/alibaba/nacos/releases)并启动 Nacos server(以Windows为例),下载后启动bin文件夹下“startup.cmd”,待出现“Nacos started successfully......”启动成功。

创建两个Module,一个服务提供者(provider),一个服务消费者(consumer)

1、服务提供者(provider)

1.1、添加pom.xml依赖

<!-- nacos服务发现 -->
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

1.2、配置文件(application.yml)

server:
  port: 8083

spring:
  application:
    name: testprovider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

spring.application.name 是服务名(被消费时会用到),spring.cloud.nacos.discovery.server-addr 为nacos服务地址

1.3、启用模块,@EnableDiscoveryClient开启注册发现

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

1.4、编写测试服务提供接口

@RestController
public class Test {
    //测试服务提供者接口
    @RequestMapping("user")
    public String getUser(@RequestBody User user)
    {
        return "username:"+user.getUsername()+",fullname"+user.getFullname();
    }
}

传参中使用@RequestBody就可以传对象了

1.5 查看服务提供者是否注册成功

服务提供者完成

 

2、服务消费者

常见的两种消费模式,一种是restTemplate,一种是feign。下面代码里两种模式都展现了,项目中用哪一种都可以

2.1、添加依赖(熔断器只在消费者中设置)

<!-- nacos服务发现 -->
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- Feign消费模式 -->
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
      <version>2.2.1.RELEASE</version>
</dependency>

<!-- 熔断器 -->
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
      <version>2.2.3.RELEASE</version>
</dependency>

2.2、配置文件(application.yml)

server:
  port: 8084

feign:
  hystrix:
    enabled: true

spring:
  application:
    name: testconsumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

要加入 feign.hystrix.enabled=true 开启熔断器功能

2.3、启用模块

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

添加三个启动注解,@EnableDiscoveryClient开启注册发现,@EnableFeignClients开启Feign消费模式,@EnableHystrix开启Hystrix熔断器

restTemplate 是用于“restTemplate”消费模式的Bean。加入@LoadBalanced 注解开启负载均衡,在调用服务接口的时候,原来host部分是通过手工拼接ip和端口的,现在直接采用服务名(服务提供者的spring.application.name)作为请求路径即可。在调用的时候Spring Cloud会将请求拦截,然后通过负载均衡器选出节点,并替换服务名部分为具体的ip和端口,实现基于服务名的负载均衡调用。

2.4 Feign消费模式,及熔断器设置

@FeignClient(name = "testprovider" ,fallback = Fallback.class)
@Component
public interface UserFeign {
    @PostMapping("user")
    String getUser(@RequestBody User user);
}

//Feign熔断
@Component
class Fallback implements UserFeign
{
    @Override
    public String getUser(User user) {
        return "有问题了";
    }
}

Feign消费模式需要写对应的“Feign”接口,然后编写相应的提供者接口地址的方法(@RequestBody注解可以传对象)。

在接口上加入@FeignClient注解,设置fallback参数开启熔断器,实现“Feign”接口即可,当出现问题时会自动调用Fallback中设置的实现类对应方法。

2.5、restTemplate消费模式及熔断器,接口调用

@RestController
public class Test {
    @Autowired
    UserFeign userFeign;

    @Autowired
    RestTemplate restTemplate;

    //Feign实现方式
    @RequestMapping("showUser/{username}")
    public String showUser(@PathVariable String username)
    {
        User user=new User();
        user.setUsername(username);
        user.setFullname("测试用户");
        return userFeign.getUser(user);
    }

    //RestTemplate实现方式
    @RequestMapping("showUser2/{username}")
    @HystrixCommand(fallbackMethod = "showUser2FaillBack")
    public String showUser2(@PathVariable String username)
    {
        User user=new User();
        user.setUsername(username);
        user.setFullname("测试用户");
        String s=restTemplate.postForObject("http://testprovider/user",user,String.class);
        return s;
    }

    //restTemplate熔断
    public String showUser2FaillBack(@PathVariable String username)
    {
        return username+",有问题了";
    }
}

Feign消费模式调用之前写好的接口

restTemplate消费模式,使用“postForObject”方法,传入接口地址(前面开启了LoadBalanced,地址写服务提供者的application.name就会自动寻找提供者服务器地址)、参数、返回值类型。

restTemplate熔断方式在方法前使用@HystrixCommand注解进行开启,设置熔断(fallbackMethod )的调用方法即可。

2.6、实体

//用户实体
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    //用户名
    private String username;
    //姓名
    private String fullname;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }
}

3、测试

feign

restTemplate

调用提供者接口成功!

3.1、熔断测试

关闭provider服务,在次调用controller

3.2、Demo结构

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值