Eureka是微服务注册组件,那么有哪些微服务组件可以替代Eureka?微服务组件有哪些?他们的区别等等。带着这些问题开始我们的这一章。
产品介绍
官方地址:https://nacos.io/zh-cn/index.html
功能介绍
- 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos
致力于帮助您发现、配置和管理微服务。Nacos
提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
动态配置服务
动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。
服务发现及管理
动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos
支持DNS
-Based和RPC
-Based(Dubbo
、gRPC
)模式的服务发现。Nacos
也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos
,您可以更容易地为您的服务实现断路器。
动态DNS
服务
通过支持权重路由,动态DNS
服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS
解析服务。动态DNS
服务还能让您更容易地实现以DNS
协议为基础的服务发现,以消除耦合到厂商私有服务发现API
上的风险。
特性介绍
易于使用
- 动态配置管理、服务发现和动态的一站式解决方案
- 20多种开箱即用的以服务为中心的架构特性
- 基本符合生产要求的轻量级易用控制台
更适应云架构
- 无缝支持
Kubernetes
和Spring Cloud - 在主流公共云上更容易部署和运行(例如阿里云和
AWS
) - 多租户和多环境支持
生产等级
- 脱胎于历经阿里巴巴10年生产验证的内部产品
- 支持具有数百万服务的大规模场景
- 具备企业级
SLA
的开源产品
丰富的应用场景
- 支持限流、大促销预案和异地多活
- 直接支持或稍作扩展即可支持大量有用的互联网应用场景
- 流量调度和服务治理
启动Nacos
- 本文下载版本:2.0.0,下载地址:https://github.com/alibaba/nacos/releases
- 导入数据库,
mysql.sql
文件,注意:这里Mysql
版本5.7可导入成功,5.5导入失败。 - 解压后进行修改配置文件:
application.properties
,修改数据库配置信息
#
# Copyright 1999-2018 Alibaba Group Holding Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos
### Default web server port:
server.port=8848
#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# nacos.inetutils.prefer-hostname-over-ip=false
### Specify local server's IP:
# nacos.inetutils.ip-address=
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
#*************** Naming Module Related Configurations ***************#
### Data dispatch task execution period in milliseconds:
# nacos.naming.distro.taskDispatchPeriod=200
### Data count of batch sync task:
# nacos.naming.distro.batchSyncKeyCount=1000
### Retry delay in milliseconds if sync task failed:
# nacos.naming.distro.syncRetryDelay=5000
### If enable data warmup. If set to false, the server would accept request without local data preparation:
# nacos.naming.data.warmup=true
### If enable the instance auto expiration, kind like of health check of instance:
# nacos.naming.expireInstance=true
nacos.naming.empty-service.auto-clean=true
nacos.naming.empty-service.clean.initial-delay-ms=50000
nacos.naming.empty-service.clean.period-time-ms=30000
### Add in 2.0.0
### The interval to clean empty service
# nacos.naming.clean.empty-service.interval=60000
### The expired time to clean empty service
# nacos.naming.clean.empty-service.expired-time=60000
### The interval to clean expired metadata
# nacos.naming.clean.expired-metadata.interval=5000
### The expired time to clean metadata
# nacos.naming.clean.expired-metadata.expired-time=60000
#*************** CMDB Module Related Configurations ***************#
### The interval to dump external CMDB in seconds:
# nacos.cmdb.dumpTaskInterval=3600
### The interval of polling data change event in seconds:
# nacos.cmdb.eventTaskInterval=10
### The interval of loading labels in seconds:
# nacos.cmdb.labelTaskInterval=300
### If turn on data loading task:
# nacos.cmdb.loadDataAtStart=false
#*************** Metrics Related Configurations ***************#
### Metrics for prometheus
#management.endpoints.web.exposure.include=*
### Metrics for elastic search
management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200
### Metrics for influx
management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true
#*************** Access Log Related Configurations ***************#
### If turn on the access log:
server.tomcat.accesslog.enabled=true
### The access log pattern:
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
### The directory of access log:
server.tomcat.basedir=
#*************** Access Control Related Configurations ***************#
### If enable spring security, this option is deprecated in 1.2.0:
#spring.security.enabled=false
### The ignore urls of auth, is deprecated in 1.2.0:
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=nacos
### If turn on auth system:
nacos.core.auth.enabled=false
### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=18000
### The default token:
nacos.core.auth.default.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=true
### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version.
nacos.core.auth.enable.userAgentAuthWhite=true
### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key=
nacos.core.auth.server.identity.value=
#*************** Istio Related Configurations ***************#
### If turn on the MCP server:
nacos.istio.mcp.server.enabled=false
###*************** Add from 1.3.0 ***************###
#*************** Core Related Configurations ***************#
### set the WorkerID manually
# nacos.core.snowflake.worker-id=
### Member-MetaData
# nacos.core.member.meta.site=
# nacos.core.member.meta.adweight=
# nacos.core.member.meta.weight=
### MemberLookup
### Addressing pattern category, If set, the priority is highest
# nacos.core.member.lookup.type=[file,address-server]
## Set the cluster list with a configuration file or command-line argument
# nacos.member.list=192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809
## for AddressServerMemberLookup
# Maximum number of retries to query the address server upon initialization
# nacos.core.address-server.retry=5
## Server domain name address of [address-server] mode
# address.server.domain=jmenv.tbsite.net
## Server port of [address-server] mode
# address.server.port=8080
## Request address of [address-server] mode
# address.server.url=/nacos/serverlist
#*************** JRaft Related Configurations ***************#
### Sets the Raft cluster election timeout, default value is 5 second
# nacos.core.protocol.raft.data.election_timeout_ms=5000
### Sets the amount of time the Raft snapshot will execute periodically, default is 30 minute
# nacos.core.protocol.raft.data.snapshot_interval_secs=30
### raft internal worker threads
# nacos.core.protocol.raft.data.core_thread_num=8
### Number of threads required for raft business request processing
# nacos.core.protocol.raft.data.cli_service_thread_num=4
### raft linear read strategy. Safe linear reads are used by default, that is, the Leader tenure is confirmed by heartbeat
# nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe
### rpc request timeout, default 5 seconds
# nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu
系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
cmd startup.cmd -m standalone
登录地址:http://127.0.0.1:8848/nacos/index.html
默认帐号密码:nacos/nacos
首页截图
问题
1、IllegalArgumentException: db.num is null
//解决办法:没有设置数据库,需要将db.num注解释放
2、WebServerException: Unable to start embedded Tomcat
//解决办法:Nacos默认是以集群的形式启动,没有找到其他的服务信息,导致失败。
//启动命令修改成以单机启动:startup.cmd -m standalone[单机] / cluster[集群]
如何注册与发现
生产者
1、添加修改pom文件,本次springcloud版本是Greenwich.SR6,springboot版本:2.1.5.RELEASE,这里继承父包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、修改配置文件,将nacos的注册地址配置进去并设置服务名称
spring.application.name=provider-dept-nacos-8007
server.port=8007
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
3、添加启动注解
@EnableDiscoveryClient
nacos会发现并扫描该服务。
注意:
共同点@EnableDiscoveryClient和@EnableEurekaClient就是:都是能够让注册中心能够发现,扫描到改服务。
不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
消费者
1、修改pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、修改配置文件,指定注册地址
spring.application.name=consumer-nacos-dept-83
server.port=83
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、添加注册发现注解:@EnableDisCoveryClient、@EnableFeignClients
注意:nacos支持restTemplate与feign两种调用方式
4、消费者代码
/**
* 添加支持restTemplate
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
/**
* 添加支持Feign
*/
@FeignClient(name = "provider-dept-nacos-8007")//微服务名称
interface EchoService {
@RequestMapping(value = "/dept/{str}", method = RequestMethod.GET)
String dept(@PathVariable("str") String str);
}
@Autowired
private RestTemplate restTemplate;
@Autowired
private EchoService echoService;
@RequestMapping(value = "/dept-rest/{str}", method = RequestMethod.GET)
public String rest(@PathVariable String str) {
return restTemplate.getForObject("http://provider-dept-nacos-8007/echo/" + str,
String.class);
}
@RequestMapping(value = "/dept-feign/{str}", method = RequestMethod.GET)
public String feign(@PathVariable String str) {
return echoService.dept(str);
}
Eureka与Nacos
、Zookeeper
区别
部署方式
- Eureka需要创建
springboot
项目,然后将euraka
服务端通过gav
的方式加载进来,然后部署项目。 nacos
是直接从阿里巴巴nacos
的官网下载jar包,启动服务。
CAP理论是分布式架构中重要理论
- 一致性(Consistency) (所有节点在同一时间具有相同的数据)
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
- Eureka只能遵从AP原则,追求可用性;
Nacos
同时支持CP
和AP原则,支持切换,AP模式下服务以临时实例注册,CP
模式下服务以永久实例注册,Nacos
集成了配置中心的功能。Zookeeper
遵从CP
原则,追求一致性
各个注册组件的差异性比较
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP +AP | AP | CP | - | CP |
健康检查 | TCP/HTTP/MYSQL /Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | - | Keep Alive |
负载均衡策略 | 权重/metadata /Selector | Ribbon | Fabio | RoundRobin | - |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud 集成 | 支持 | 支持 | 支持 | 不支持 | 支持 |
Dubbo 集成 | 支持 | 不支持 | 支持 | 不支持 | 支持 |
K8S 集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
注册组件区分
Consul强一致性©带来的是:
服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功
Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。
Eureka保证高可用(A)和最终一致性:
服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功
当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。
其他方面,eureka就是个servlet
程序,跑在servlet
容器中; Consul则是go编写而成。
Nacos
支持CP
+AP可自定义切换
Nacos
是阿里开源的,Nacos
支持基于DNS
和基于RPC
的服务发现。在Spring Cloud中使用Nacos
,只需要先下载 Nacos 并启动Nacos
server,Nacos
只需要简单的配置就可以完成服务的注册发现。Nacos
除了服务的注册发现之外,还支持动态配置服务。动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。- 一句话概括就是
Nacos
= Spring Cloud注册中心 + Spring Cloud配置中心。
本章使用的代码已经开源到githup,地址见下方。
其他章节请查看我其他文章。如有不足感谢在评论区提出。
欢迎点赞、关注!
SpringCloud Dalston版本代码开源地址:
代码地址
SpringCloud Hoxton版本代码开源地址:
代码地址
SpringCloud 技术群聊地址:
Q群地址