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