注册中心
Spring Cloud出来已经很久了,基本趋于成熟,有多套可用的方案。这里先来看看注册中心。
分类
-
Nacos
alibaba套件中的一员,目前很火,中国未来趋势。
-
Consul
Spring Cloud 官方推荐注册中心,用来代替Eureka,未来趋势。
-
Eureka
已经停止维护,但依旧很多项目使用,官方推荐使用Consul。
接下来重点看看Nacos和Consul。
Nacos
-
简介
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,Nacos 作为其核心组件之一,可以作为注册中心和配置中心使用。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 具有如下特性:
- 服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现,支持对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求;
- 动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置;
- 动态 DNS 服务:动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务;
- 服务及其元数据管理:支持从微服务平台建设的视角管理数据中心的所有服务及元数据。
-
启动
- 我们先从官网下载Nacos,这里下载的是
nacos-server-1.3.2.zip
文件,下载地址:https://github.com/alibaba/nacos/releases - 配置
JAVA_HOME
环境变量 - 解压安装包,cmd切换到
bin
目录下,./startup.cmd -m standalone
; - 运行成功后,访问 http://localhost:8848/nacos 可以查看Nacos的主页,默认账号密码都是nacos。
- 我们先从官网下载Nacos,这里下载的是
-
服务提供
-
创建nacos-provider模块和nacos-consumer模块;
项目在github都可以找到:https://github.com/xlxsui
-
如果要使用Spring Cloud Alibaba 的组件都需要在pom.xml中添加如下的配置
<project> // ... <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
-
修改依赖,注册到Nacos
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
配置文件
server: port: 20011 spring: application: name: nacos-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'
-
controller创建ProviderController
@RestController @RequestMapping(value = "/provider", produces = "application/json; charset=utf-8") public class ProviderController { @GetMapping("/hi/{name}") public String hi(@PathVariable String name) { return "微服务返回内容, name: " + name; } }
-
运行就可以在nacos上看到实例了
-
-
服务消费
-
使用Feign做负载均衡以及Hystrix服务降级调用服务
-
创建nacos-provider项目
-
依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> <version>2.2.4.RELEASE</version> </dependency>
-
配置
server: port: 20012 spring: application: name: nacos-consumer cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'
-
项目文件
在controller目录创建ConsumerController:
@RestController @RequestMapping(value = "/consumer", produces = "application/json; charset=utf-8") public class ConsumerController { private static final Logger logger = LoggerFactory.getLogger(ConsumerController.class); @Autowired private ConsumerService consumerService; @GetMapping("/getHi/{name}") public String getHi(@PathVariable String name) { logger.info("**************getHi {}", name); String msg = consumerService.getHi(name); logger.info("*************getHi provider msg: {}", msg); return msg; } }
config目录新建Configuration
@org.springframework.context.annotation.Configuration public class Configuration { @Bean public ServletRegistrationBean<HystrixMetricsStreamServlet> getServlet() { HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; } }
service目录
新建ConsumerService
@Service public class ConsumerService { @Autowired FeignService feignService; public String getHi(String name) { String msg = feignService.hi(name); return msg; } }
service目录下新建feign目录
创建FeignService FeignServiceFactory FeignServiceFallback
@FeignClient(value = "nacos-provider", fallback = FeignServiceFallback.class) public interface FeignService { @GetMapping("/provider/hi/{name}") String hi(@PathVariable String name); }
@Component public class FeignServiceFactory implements FallbackFactory<FeignService> { private final FeignServiceFallback feignServiceFallback; public FeignServiceFactory(FeignServiceFallback feignServiceFallback) { this.feignServiceFallback = feignServiceFallback; } @Override public FeignService create(Throwable throwable) { return feignServiceFallback; } }
@Component public class FeignServiceFallback implements FeignService { @Override public String hi(String name) { return "fail hi"; } }
-
加上注解
@SpringCloudApplication @EnableHystrixDashboard @EnableFeignClients
-
运行,调用getHi接口,可以拿到provider的返回。把provider服务关闭,返回熔断信息。
-
-
当作配置中心
-
创建nacos-config-client模块
-
依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
配置
application.yml
spring: profiles: active: dev
bootstrap.yml
server: port: 20013 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos地址 config: server-addr: localhost:8848 #Nacos地址 file-extension: yaml #这里我们获取的yaml格式的配置
-
controller
ConfigClientController
@RestController @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/configInfo") public String getConfigInfo() { return configInfo; } }
-
在Nacos添加配置
DataId:
nacos-config-client-dev.yaml
命名格式:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
配置信息:
config: info: "config info for 开发模式"
-
运行调用configInfo接口,成功
-
动态刷新
在Nacos上修改后,重新调用接口,发现配置信息已经自动更新了
-