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

    技术2023-12-29  71

    下载安装 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结构

    Processed: 0.009, SQL: 9