整体框架划分
整个框架的搭建采用SpringCloud,自然我们的服务网关采用Zuul,客户端访问后台各个服务先通过网关进行初步权限认证(Zuul+jwt),通过网关后在进行其他菜单权限的校验,此处需要提供权限校验的服务。各个服务注册到阿里的Nacos注册中心,由Nacos进行服务注册和服务发现,各个服务的调用采用FeignClient的形式,Feign自带Ribbon 进行负载均衡配置。服务熔断采用Hystrix。后台各个服务分库分表,服务间同样采用服务调用的方式,减少各个业务模块数据表的相互管理,各个模块数据交互以服务的形式进行访问。整个后端底层是mysql、redis、mq、fastfds(分布式文件管理)等。
使用Nacos进行服务注册与发现
以下所有的Nacos配置都来源于阿里的官方Nacos文档
配置Nacos注册中心
参考(https://nacos.io/zh-cn/docs/quick-start.html)
从 https://github.com/alibaba/nacos/releases 下载安装包,解压后 cd 到bin目录下, 我们以单机模式启动,windows 下执行 cmd startup.cmd,
linux 下执行
sh startup.sh -m standalone
如果在Ubuntu 下执行报错 找不到 cluster.conf,请执行下面命令
bash startup.sh -m standalone
服务默认使用8848端口,服务启动成功后,浏览器访问 http://localhost:8848/nacos 用户名密码均为 nacos,至此 注册中心单机版配置成功。
创建项目注册到Nacos
创建springcloud 项目,引入如下配置:
org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery 0.2.1.RELEASE
然后在启动类加入EnableDiscoveryClient 注解
@SpringBootApplication @EnableDiscoveryClient public class NacosApplication { public static void main(String[] args) { SpringApplication.run(NacosApplication.class, args); } }
application.yml 配置如下:
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: nacos-magic server: port: 8763
启动创建好的项目,访问Nacos控制台,在服务列表中可以看到对应的服务 nacos-magic。更改nacos-magic 服务的端口后,再启动一个服务,我们就将两个一样的服务注册到了Nacos
负载均衡的两种实现方式
一种是ribbon+restTemplate,另一种是feign。参考(https://www.fangzhipeng.com/springcloud/2017/06/02/sc02-rest-ribbon.html)
ribbon+restTemplate实现负载均衡
需要提供如下服务:url以服务的形式配置,这样就可以通过服务名调用,后端的多个同名服务,实现负载均衡。
@Service public class HiService { @Autowired RestTemplate restTemplate; public String hiService(String name){ return restTemplate.getForObject("http://nacos-magic/sayHello/"+name,String.class); } }
项目中需要配置RestTemplate 自动注入与负载均衡
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
对外提供如下controller
@RestController @RequestMapping("/") public class HController { @Autowired HiService hiService; @RequestMapping("/sayHi/{name}") public String sayHi(@PathVariable("name") String name){ return hiService.hiService(name); } }
Feign实现负载均衡,也是我们在用的方式
Feign默认集成了Ribbon,默认实现了负载均衡的效果。
需要提供如下接口:
@FeignClient("nacos-magic") public interface SayHelloService { @RequestMapping(value="/sayHello/{name}",method = RequestMethod.GET) String sayHi(@PathVariable("name") String name); }
以下是调用:
@RestController @RequestMapping("/") public class SayHiController { @Autowired SayHelloService sayHelloService; @RequestMapping("/sayHi/{name}") public String sayHi(@PathVariable("name") String name){ return sayHelloService.sayHi(name); } }
这样也能调用到其他服务,实现负载均衡。