第一篇我们写了使用nacos作为配置中心
这一篇我们将使用nacos注册中心、服务的调用、负载均衡,不要眨眼
在payment-service模块pom.xml文件中添加:
修改payment-service模块的bootstrap.yml
新增红色框的部分哈
在启动类PaymentServiceApplication上添加@EnableDiscoveryClient
这个和springCloud一样
接下来我们重启下我们的payment-service服务,查看下nacos
我们可以看到,服务已经注册上去了
我们也可以再启动一个payment-service服务,会看到实例数增加到了2个
以上就是我们单个服务的注册演示。
接下来我们利用两个服务来搭建服务之间的调用、负载均衡
新建一个account-service模块,配置基本和payment-service差不多
application.yml:
bootstrap.yml
新建一个User.java实体:
public class User {
private int id;
private Stringname;
private Balancebalance;
public User(){
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
}
新建一个AccountController.java
@RestController
@RefreshScope
public class AccountController {
@Autowired
private BalanceServicebalanceService;
final static MapuserMap =new HashMap() {
{
put(1, new User(1, "张三"));
put(2, new User(2, "李四"));
put(3, new User(3, "王五"));
}
};
@RequestMapping("/acc/user")
public UsergetUser(@RequestParam Integer id) {
System.out.println("--查询用户--"+id);
if (id !=null &&userMap.containsKey(id)) {
User user =userMap.get(id);
//填坑说明:原博客无这段代码(这里,大家可以把这行代码注释了之后,看看account-service服务是否正常访问)
user.setBalance(balanceService.getBalance(id));
return user;
}
return new User(0, "");
}
}
访问服务试试:
查看下nacos的服务情况
给两个服务添加feign和ribbon的依赖
在account-service服务的启动类中开启feign客户端功能;
在account-service模块中添加BalanceService接口
@Component
@FeignClient(name="payment-service",fallback = BalanceServiceFallBack.class)
public interface BalanceService {
@RequestMapping(value ="/pay/balance", method = RequestMethod.GET)
BalancegetBalance(@RequestParam("id") Integer id);
}
并提供一个BalanceService接口的实现类BalanceServiceFallBack
@Component
public class BalanceServiceFallBack implements BalanceService{
@Override
public BalancegetBalance(Integer id) {
return new Balance(0, 0, 0, "服务调用超时,执行降级!");
}
}
接下来,我们试着用account-service服务中的getUser方法来调用到payment-service服务
通过account-service访问paymen-service遇到报错了--一脸懵逼,之前都好好的;瞬间想到后面用到sentinel的时候,添加sentinel主包导致的。但不定确定...排查中。。。
debug果然发现了问题,template中没有path这个方法。而是url...
然后就去找对应的包...
非常确定是jar包的版本问题....
为了找这个问题,我折腾了2个小时,换了好几个sentinel的版本都有问题,网上的各种版本匹配的博客也有问题,最后我退回代码,找到了问题所在,这里一定要注意下springCloud和boot版本,本文中已经为大家修正,不用管。
本文中用的是:
访问account-service看看能否获取的payment-service中的balance方法
在这里服务之间的调用到此结束
接下来,我们试试负载均衡,再启动一个payment-service服务(这里自己打个jar包跑起来),我们看看请求是否均摊到2个服务上。
可以看到,请求均摊到了不同的payment-service服务上了。
到这里本篇结束
spring cloud alibaba 实战篇(三)——sentinel服务降级