整体框架划分
整个框架的搭建采用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);
}
}
这样也能调用到其他服务,实现负载均衡。