下载安装 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:8848spring.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结构