学做室内效果图的网站,用DW做的网站怎么分享给别人,西安技术网站建设,茶叶网站建设网页设计制作为什么需要注册中心
思考#xff1a;网络请求#xff0c;如果服务提供者发生变动#xff0c;服务调用者如何感知服务提供者的ip和端口变化#xff1f;
// 微服务之间通过RestTemplate调用#xff0c;ip:port写死#xff0c;如果ip或者port变化呢#xff1f;
String ur…为什么需要注册中心
思考网络请求如果服务提供者发生变动服务调用者如何感知服务提供者的ip和端口变化
// 微服务之间通过RestTemplate调用ip:port写死如果ip或者port变化呢
String url http://localhost:8020/order/findOrderByUserId/id;
R result restTemplate.getForObject(url,R.class);所以在服务提供者的 ip 或端口发生变化时服务调用者能够及时感知到这也就是注册中心的作用。
服务注册中心的作用就是服务注册与发现
服务注册就是将提供某个服务的模块信息通常是这个服务的ip和端口注册到1个公共的组件上去。服务发现就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。 注册中心选型
NacosEurekaConsulCoreDNSZookeeper一致性协议CPAPAPCP-CP健康检查TCP/HTTP/MySql/Client BeatClient BeatTCP/HTTP/gRPC/CMD-Keep Alive负载均衡策略权重/Metadata/SelectorRibbonFabioRoundRobin-雪崩保护有有无无无自动注销实例支持支持支持不支持支持访问协议HTTP/DNSHTTPHTTP/DNSDNSTCP监听支持支持支持支持不支持支持多数据中心支持支持支持不支持不支持跨注册中心同步支持不支持支持不支持不支持SpringCloud 集成支持支持支持不支持支持Dubbo 集成支持不支持支持不支持支持K8S 集成支持不支持支持支持不支持
Nacos 是什么 官方介绍https://nacos.io/zh-cn/docs/v2/what-is-nacos.html Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。 Nacos 优势
易用简单的数据模型标准的 restfulAPI易用的控制台丰富的使用文档。稳定99.9% 高可用脱胎于历经阿里巴巴 10 年生产验证的内部产品支持具有数百万服务的大规模场景具备企业级 SLA 的开源产品。实时数据变更毫秒级推送生效1w 级SLA 承诺 1w 实例上下线 1s99.9% 推送完成10w 级SLA 承诺 1w 实例上下线 3s99.9% 推送完成100w 级别SLA 承诺 1w 实例上下线 9s 99.9% 推送完成。规模十万级服务/配置百万级连接具备强大扩展性。
Nacos 注册中心架构 相关核心概念
服务Service
服务是指一个或一组软件功能例如特定信息的检索或一组操作的执行其目的是不同的客户端可以为不同的目的重用例如通过跨进程的网络调用。Nacos 支持主流的服务生态如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service。
服务注册中心Service Registry
服务注册中心它是服务及其实例和元数据的数据库。服务实例在启动时注册到服务注册表并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
服务元数据Service Metadata
服务元数据是指包括服务端点endpoints、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。
服务提供方Service Provider
是指提供可复用和可调用服务的应用方。
服务消费方Service Consumer
是指会发起对某个服务调用的应用方。
核心功能
服务注册
Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务提供自身的元数据比如ip地址、端口等信息。Nacos Server接收到注册请求后就会把这些元数据信息存储在一个双层的内存Map中。
服务心跳
在服务注册后Nacos Client会维护一个定时心跳来持续通知Nacos Server说明服务一直处于可用状态防止被剔除。默认5s发送一次心跳。
服务同步
Nacos Server集群之间会互相同步服务实例用来保证服务信息的一致性。
服务发现
服务消费者Nacos Client在调用服务提供者的服务时会发送一个REST请求给Nacos Server获取上面注册的服务清单并且缓存在Nacos Client本地同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。
服务健康检查
Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false客户端服务发现时不会发现如果某个实例超过30秒没有收到心跳直接剔除该实例被剔除的实例如果恢复发送心跳则会重新注册
微服务整合 Nacos 注册中心实战
Nacos Server 环境搭建 官方文档https://nacos.io/zh-cn/docs/v2/guide/admin/deployment.html 1下载nacos server安装包选择安装nacos server版本v2.2.1。
wget https://github.com/alibaba/nacos/releases/download/2.2.1/nacos-server-2.2.1.tar.gz2解压进入conf/application.properties配置nacos.core.auth.plugin.nacos.token.secret.key密钥
# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥使用默认值有安全风险 (2.2.0.1后无默认值)
nacos.core.auth.plugin.nacos.token.secret.keyaiDLyHlCgaXB08FL5zS3W6YQZssTVNScY注意在2.2.0.1版本后社区发布版本需要自行填充nacos.core.auth.plugin.nacos.token.secret.key的值否则无法启动节点。自定义密钥时推荐将配置项设置为Base64编码的字符串且原始密钥长度不得低于32字符。否则启动报错如下 权限认证https://nacos.io/zh-cn/docs/v2/guide/user/auth.html 3进入nacos目录单机模式启动nacos
bin/startup.sh -m standalone进入 bin/startup.sh 文件可以将默认的启动模式改为 MODE“standalone”启动日志
4访问nacos的管理端 http://192.168.0.83:8848/nacos 默认的用户名密码是nacos/nacos。
微服务提供者整合 Nacos
使用 Spring Cloud Alibaba Nacos Discovery可基于 Spring Cloud 的编程模型快速接入 Nacos 服务注册功能。服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上。
以order-service整合nacos为例
1引入依赖order-service模块pom中引入nacos-client依赖
!-- nacos服务注册与发现 --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency2启动类上添加EnableDiscoveryClient注解此注解可以省略
EnableDiscoveryClient
SpringBootApplication
public class TestNacosApplication {public static void main(String[] args) {SpringApplication.run(TestNacosApplication.class, args);}}3yml配置文件中配置nacos注册中心地址
server:port: 8080spring:application:name: order-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.0.83:8848 #注册中心地址建议用域名替换ip 更多配置https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery 4启动order-service服务nacos管理端界面查看order-service是否注册成功如果是云服务器需要将 9848 端口开启否则启动会报错。
5测试通过Open API查询实例列表 http://192.168.0.83:8848/nacos/v2/ns/instance/list?serviceNameorder-service 微服务调用者整合 Nacos
服务调用者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
以user-service整合nacos为例
1user-service模块pom中引入nacos-client依赖
!-- nacos服务注册与发现 --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency2启动类上添加EnableDiscoveryClient注解此注解可以省略
SpringBootApplication
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class);}
}3yml配置文件中配置nacos注册中心地址
server:port: 8081spring:application:name: user-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.0.83:88484启动user-service服务nacos管理端界面查看user-service是否注册成功
整合 RestTemplateSpring Cloud LoadBalancer 实现微服务调用
Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器实现用来替代Ribbon。对于负载均衡机制增加了ReactiveLoadBalancer接口并提供了基于round-robin轮询和Random随机的实现。 官方文档https://docs.spring.io/spring-cloud-commons/docs/4.0.4/reference/html/#spring-cloud-loadbalancer loadbalancer常用的配置
spring:cloud:# 负载均衡配置loadbalancer:ribbon:# 禁用ribbonenabled: falsecache:# 启用本地缓存, 根据实际情况权衡enabled: true# 缓存空间大小capacity: 1000# 缓存的存活时间, 单位sttl: 2# caffeine缓存的配置, 需引入caffeine依赖caffeine:# initialCapacity初始的缓存空间大小,expireAfterWrite最后一次写入后经过固定时间过期spec: initialCapacity500,expireAfterWrite5shealth-check:# 重新运行运行状况检查计划程序的时间间隔。interval: 25s# 运行状况检查计划程序的初始延迟值initial-delay: 30retry: # 需要引入Spring Retry依赖# 该参数用来开启重试机制默认是关闭enabled: true# 切换实例的重试次数max-retries-on-next-service-instance: 2# 对当前实例重试的次数max-retries-on-same-service-instance: 0# 对所有的操作请求都进行重试retry-on-all-operations: true# Http响应码进行重试retryable-status-codes: 500,404,502user-service调用order-service获取用户订单信息为例
1引入依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-loadbalancer/artifactId
/dependency2使用RestTemplate进行服务调用给 RestTemplate 实例添加 LoadBalanced 注解开启 LoadBalanced 与 loadbalancer 的集成
Configuration
public class RestConfig {BeanLoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}3user-service中编写调用逻辑调用order-service服务
RequestMapping(value /findOrderByUserId/{id})
public R findOrderByUserId(PathVariable(id) Integer id) {// 利用LoadBalancedrestTemplate需要添加LoadBalanced注解// 注意此处域名填调用方注册的微服务名String url http://order-service/order/findOrderByUserId/id;R result restTemplate.getForObject(url,R.class);return result;
}测试[http://localhost:8080/user/findOrderByUserId/1](http://localhost:8040/user/findOrderByUserId/1)返回数据
Nacos 注册中心常用配置
服务分级存储模型
注册中心的核心数据是服务的名字和它对应的网络地址当服务注册了多个实例时我们需要对不健康的实例进行过滤或者针对实例的⼀些特征进行流量的分配那么就需要在实例上存储⼀些例如健康状态、权重等属性。随着服务规模的扩大渐渐的又需要在整个服务级别设定⼀些权限规则、以及对所有实例都生效的⼀些开关于是在服务级别又会设立⼀些属性。再往后我们又发现单个服务的实例又会有划分为多个子集的需求例如⼀个服务是多机房部署的那么可能需要对每个机房的实例做不同的配置这样又需要在服务和实例之间再设定⼀个数据级别。Nacos 在经过内部多年生产经验后提炼出的数据模型则是⼀种服务-集群-实例的三层模型。这样基本可以满足服务在所有场景下的数据存储和管理。官网图片如下
集群配置
在原有配置加入以下配置
spring:application:name: order-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.0.83:8848cluster-name: SH案例跨集群调用优先本地集群的场景实现
利用cluster-name可以实现跨集群调用时优先选择本地集群的实例本地集群不可访问时再去访问其他集群。下面是Ribbon的NacosRule实现的负载均衡算法就是利用了cluster-name实现了优先调用本地集群实例。
LoadBalancer默认情况下使用的ReactiveLoadBalancer实现是RoundRobinLoadBalancer。要切换到不同的实现无论是针对所选服务还是所有服务都可以使用自定义LoadBalancer配置机制。
// 注意不要用Configuration修饰
public class CustomLoadBalancerConfiguration {BeanReactorLoadBalancerServiceInstance randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory, NacosDiscoveryProperties nacosDiscoveryProperties){String name environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name,nacosDiscoveryProperties);}
}在启动类上添加LoadBalancerClient注解 SpringBootApplication
LoadBalancerClient(value order-service, configuration CustomLoadBalancerConfiguration.class)
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}}服务逻辑隔离
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串公共命名空间public分组默认是DEFAULT_GROUP。
Namespace 隔离设计
命名空间Namespace用于进行租户用户粒度的隔离Namespace 的常用场景之一是不同环境的隔离例如开发测试环境和生产环境的资源如配置、服务隔离等。
修改yml配置
spring:application:name: user-service # 微服务名称cloud:nacos:discovery:server-addr: 192.168.0.83:8848 # 配置nacos注册中心地址namespace: bc50d386-8870-4a26-8803-0187486c57be # dev开发环境启动user-service进入nacos控制台可以看到user-service注册成功所属namespace是dev测试[http://localhost:8081/user/findOrderByUserId/1](http://localhost:8040/user/findOrderByUserId/1)报错原因order-service和user-service使用了不同的namespace导致服务隔离user-service无法发现可用的order-service服务。
group 服务分组
不同的服务可以归类到同一分组group也可以起到服务隔离的作用。yml中可以通过spring.cloud.nacos.discovery.group参数配置。group更多应用场景是配置分组。
临时实例和持久化实例
在定义上区分临时实例和持久化实例的关键是健康检查的方式。临时实例使用客户端上报模式而持久化实例使用服务端反向探测模式。临时实例需要能够自动摘除不健康实例而且无需持久化存储实例。持久化实例使用服务端探测的健康检查方式因为客户端不会上报心跳所以不能自动摘除下线的实例。在大中型的公司里这两种类型的服务往往都有。⼀些基础的组件例如数据库、缓存等这些往往不能上报心跳这种类型的服务在注册时就需要作为持久化实例注册。而上层的业务服务例如微服务服务的 Provider 端支持添加汇报心跳的逻辑此时就可以使用动态服务的注册方式。Nacos 1.x 中持久化及非持久化的属性是作为实例的⼀个元数据进行存储和识别。Nacos 2.x 中继续沿用了持久化及非持久化的设定但是有了⼀些调整。在 Nacos2.0 中将是否持久化的数据抽象至服务级别且不再允许⼀个服务同时存在持久化实例和非持久化实例实例的持久化属性继承自服务的持久化属性。
# 持久化实例ephemeral表示“短暂的”
spring.cloud.nacos.discovery.ephemeral: falsenacos 开启权限认证 官网说明https://nacos.io/zh-cn/docs/v2/guide/user/auth.html nacos server端conf/application.properties添加如下配置
# 开启认证
nacos.core.auth.enabledtrue
# 配置自定义身份识别的key不可为空和value不可为空
# 这两个属性是auth的白名单用于标识来自其他服务器的请求。具体实现见com.alibaba.nacos.core.auth.AuthFilter
nacos.core.auth.server.identity.keyauthKey
nacos.core.auth.server.identity.valuenacosSecurty微服务端application.yml中添加如下配置
spring:application:name: order-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.0.83:8848username: nacospassword: nacos如果没有配置username 和 password微服务端启动会抛出如下错误
Nacos集群搭建 官网文档 https://nacos.io/zh-cn/docs/v2/guide/admin/cluster-mode-quick-start.html 集群部署架构图
因此开源的时候推荐用户把所有服务列表放到一个vip下面然后挂到一个域名下面。
http://ip1:port/openAPI直连ip模式机器挂了则需要修改ip才可以使用。http://SLB:port/openAPI挂载SLB模式内网SLB不可暴露到公网以免带来安全风险直连SLB即可下面挂server真实ip可读性不好。http://nacos.com:port/openAPI域名 SLB模式内网SLB不可暴露到公网以免带来安全风险可读性好而且换ip方便推荐模式。 端口与主端口的偏移量描述88480主端口客户端、控制台及OpenAPI所使用的HTTP端口98481000客户端gRPC请求服务端端口用于客户端向服务端发起连接和请求98491001服务端gRPC请求服务端端口用于服务间同步等7848-1000Jraft请求服务端端口用于处理服务端间的Raft相关请求
使用VIP/nginx请求时需要配置成TCP转发不能配置http2转发否则连接会被nginx断开。9849和7848端口为服务端之间的通信端口请勿暴露到外部网络环境和客户端测。
三节点集群搭建
1环境准备
安装好 JDK需要 1.8 及其以上版本建议2核 CPU / 4G 内存 及其以上建议生产环境 3 个节点 及其以上 准备三台centos7服务器 192.168.65.174 192.168.65.192 192.168.65.204 准备好nacos安装包
2配置集群配置文件在nacos的解压目录nacos/的conf目录下有配置文件cluster.conf请每行配置成ip:port。
mv conf/cluster.conf.example conf/cluster.conf
vim conf/cluster.conf# ip:port
192.168.65.174:8848
192.168.65.192:8848
192.168.65.204:8848注意不要使用localhost或127.0.0.1针对多网卡环境nacos可以指定网卡或ip
# 多网卡选择
# ip-address参数可以直接设置nacos的ip
# 该参数设置后将会使用这个IP去cluster.conf里进行匹配请确保这个IP的值在cluster.conf里是存在的
nacos.inetutils.ip-address10.11.105.155# use-only-site-local-interfaces参数可以让nacos使用局域网ip这个在nacos部署的机器有多网卡时很有用可以让nacos选择局域网网卡
nacos.inetutils.use-only-site-local-interfacestrue# ignored-interfaces支持网卡数组可以让nacos忽略多个网卡
nacos.inetutils.ignored-interfaces[0]eth0
nacos.inetutils.ignored-interfaces[1]eth1# preferred-networks参数可以让nacos优先选择匹配的ip支持正则匹配和前缀匹配
nacos.inetutils.preferred-networks[0]30.5.124.
nacos.inetutils.preferred-networks[0]30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d))),30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d)))
3开启默认鉴权插件修改conf目录下的application.properties文件
nacos.core.auth.enabledtrue
nacos.core.auth.system.typenacos
nacos.core.auth.plugin.nacos.token.secret.key${自定义保证所有节点一致}
nacos.core.auth.server.identity.key${自定义保证所有节点一致}
nacos.core.auth.server.identity.value${自定义保证所有节点一致}4配置数据源使用外置mysql数据源生产使用建议至少主备模式。
4.1初始化 MySQL 数据库 sql脚本https://github.com/alibaba/nacos/blob/2.2.1/distribution/conf/mysql-schema.sql 4.2修改application.properties配置
spring.datasource.platformmysql
db.num1
db.url.0jdbc:mysql://192.168.65.174:3306/nacos_devtest?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneUTC
db.user.0root
db.password.0root5分别启动三个nacos节点以192.168.65.204为例进入nacos目录启动nacos
bin/startup.sh6访问nacos管理界面登录[http://192.168.65.204:8848/nacos](http://192.168.65.204:8848/nacos)用户名和密码都是nacos。微服务yml中配置
spring:application:name: user-service # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 192.168.65.174:8848,192.168.65.192:8848,192.168.65.204:8848username: nacospassword: nacos Nginx配置负载均衡
使用VIP/nginx请求时需要配置成TCP转发不能配置http2转发否则连接会被nginx断开。9849和7848端口为服务端之间的通信端口请勿暴露到外部网络环境和客户端测。1准备nginx环境
1.1如果安装了nginx先检查nginx是否有stream模块输出中包含--with-stream
nginx -V1.2安装nginx
# 安装依赖包
yum -y install gcc gcc-c autoconf automake
yum -y install zlib zlib-devel openssl openssl-devel pcre-devel# 下载nginx
wget https://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0# 编译nginx如果使用 nginx 的 stream 功能在编译时一定要加上 “--with-stream”
./configure --with-stream
make make install
#安装后nginx默认路径/usr/local/nginx2配置http模块在nginx的http下面配置http协议相关的地址和端口
http {# nacos服务器http相关地址和端口upstream nacos-server {server 192.168.65.174:8848;server 192.168.65.192:8848;server 192.168.65.204:8848;}server {listen 8848;location / {proxy_pass http://nacos-server/;}}
}3配置grpc需要nginx有stream模块支持。
# nacos服务器grpc相关地址和端口需要nginx已经有stream模块
# stream块用于做TCP转发
stream {upstream nacos-server-grpc {server 192.168.65.174:9848;server 192.168.65.192:9848;server 192.168.65.204:9848;}server {listen 9848;proxy_pass nacos-server-grpc;}
}启动nginx然后就可以正常使用了。
sbin/nginx -c conf/nginx.conf微服务yml中配置
spring:application:name: mall-user # 微服务名称# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: nacos.service.com:8848 # nacos.service.com 需建立和nginx ip的域名映射username: nacospassword: nacos