栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

微服务03

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

微服务03

微服务03_nacos注册中心

一、nocos注册中心

1、win安装:2、服务注册到Nacos3、Nacos服务分级存储模型

配置集群实例属性 4、集群负载均衡

1.添加配置,加入集群将Bean进行更改,将轮巡改为随机2.将 轮巡 改为 优先选择集群(测试) 5、根据权重负载均衡(测试)6、环境隔离 - namespace 二、Eureka/nocos对比三、Nacos配置管理

1、统一配置管理的服务

1.创建配置2.启动时,读取yaml的顺序:3.引入 nacos-config 依赖4.添加 bootstrap.yml 【其中必须是yaml】5. 测试:使用代码来验证是否拉取成功 2、配置热更新

方式一:在 @Value 注入的变量所在类上添加注解 @RefreshScope方式二:使用 @ConfigurationProperties 注解读取配置文件,就不需要加 @RefreshScope 注解。 3、配置共享

添加一个环境共享配置:测试: 运行两个 UserApplication,使用不同的profile配置的优先级: 4、搭建Nacos集群

1. 搭建mysql集群并初始化数据库表2. 下载解压nocos3. 修改集群配置节点信息、数据库配置4. 分别启动多个nacos节点5. nginx反向代理idea代码中application.yml文件配置如下:而后在浏览器访问:http://localhost/nacos即可。

一、nocos注册中心

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka
功能更加丰富,在国内受欢迎程度较高。

1、win安装:

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases

    解压文件nacos-server-1.4.1.zip
    目录分析:
    target:是一个jar包,而nocos是基于JAVA语言实现。
    conf:配置文件。例如端口默认8848
    bin:可执行文件。可以直接startup.

    cmd下启动:startup.cmd -m standalone 【模式:单机启动】

2、服务注册到Nacos
    第一步:在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖

	com.alibaba.cloud
	spring-cloud-alibaba-dependencies
	2.2.6.RELEASE
	pom
	import

    注释掉order-service和user-service中原有的eureka依赖。添加nacos的客户端依赖:

	com.alibaba.cloud
	spring-cloud-starter-alibaba-nacos-discovery

    修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址:
spring:
	cloud:
		nacos:
			server-addr: localhost:8848 # nacos 服务端地址

3、Nacos服务分级存储模型

Nacos服务分级存储模型
① 一级是服务,例如userservice
② 二级是集群,例如杭州或上海
③ 三级是实例,例如杭州机房的某台部署了userservice的服务器
2. 如何设置实例的集群属性
① 修改application.yml文件,添加spring.cloud.nacos.discovery.cluster-name属性即可

配置集群实例属性

修改application.yml,添加如下内容:

spring:
	cloud:
		nacos:
			server-addr: localhost:8848 # nacos 服务端地址
			discovery:
				cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州



4、集群负载均衡

需要给Order配置集群属性,目的是为了:当order远程调用user服务时,能选择本地集群。【能选择同一个名字的集群】(实例配置好了集群,是为了能选择实例集群)。

1.添加配置,加入集群
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos 服务端地址
      discovery:
        cluster-name: HZ

将Bean进行更改,将轮巡改为随机
@Bean
public IRule iRule(){
    //默认为轮询规则,这里自定义为随机规则
    return new NacosRule();
}
2.将 轮巡 改为 优先选择集群(测试)

优先选择集群,在集群中,在进行随机访问。

userservice:
  ribbon:
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
    NFLoadBalancerRuleClassName:  com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
5、根据权重负载均衡(测试)

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高

实例的权重控制
① Nacos控制台可以设置实例的权重值,0~1之间
② 同集群内的多个实例,权重越高被访问的频率越高
③ 权重设置为0则完全不会被访问.

当版本升级的时候,可以将8081服务器的权重调为0,那么81不在接受用户的请求了,可以做一些版本的升级,那么可以放出0.1来,让少量的客户进来测试,如果没有问题,可以继续扩大权重。从而让用户无感知的,进行服务器的升级。

6、环境隔离 - namespace

层次:NameSpace—Group—Service/Date—DEFAULT_GROUP—实例

创建命名空间

修改服务的命名空间:
二、Eureka/nocos对比

    Nacos与eureka的共同点
    ① 都支持服务注册和服务拉取
    ② 都支持服务提供者心跳方式做健康检测

    Nacos与Eureka的区别
    ① Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    ② 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    ③ Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    ④ Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方法

三、Nacos配置管理 1、统一配置管理的服务

该服务会记录核心的配置,当其他微服务启动的时候,会读取配置管理的服务,和本地的配置服务相结合使用。
当配置发生了更改,不用逐个服务去更改,而是找到【服务配置中心】,进行修改即可。
当修改了【配置中心】的信息后,该服务会通知各个服务,从而各个服务去完成配置的读取。

1.创建配置

注意:项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置(例如数据库连接)还是保存在微服务本地比较好

2.启动时,读取yaml的顺序:

首先我们需要了解 Nacos 读取配置文件的环节是在哪一步,在没加入 Nacos 配置之前,获取配置是这样:
加入 Nacos 配置,它的读取是在 application.yml 之前的:
这时候如果把 nacos 地址放在 application.yml 中,显然是不合适的,Nacos 就无法根据地址去获取配置了。
因此,nacos 地址必须放在优先级最高的 bootstrap.yml 文件。
3.引入 nacos-config 依赖

首先,在 user-service 服务中,引入 nacos-config 的客户端依赖:


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-config

4.添加 bootstrap.yml 【其中必须是yaml】

然后,在 user-service 中添加一个 bootstrap.yml 文件,内容如下:

spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

根据 spring.cloud.nacos.server-addr 获取 nacos地址,再根据 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。
在这个例子例中,就是去读取 userservice-dev.yaml

5. 测试:使用代码来验证是否拉取成功

在 user-service 中的 UserController 中添加业务逻辑,读取 pattern.dateformat 配置并使用:

@Value("${pattern.dateformat}")
private String dateformat;

@GetMapping("now")
public String now(){
    //格式化时间
    return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}

启动服务后,访问:http://localhost:8081/user/now

2、配置热更新

我们最终的目的,是修改 nacos 中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。

有两种方式:1. 用 @value 读取配置时,搭配 @RefreshScope;2. 直接用 @ConfigurationProperties 读取配置

方式一:在 @Value 注入的变量所在类上添加注解 @RefreshScope

@RefreshScope
方式二:使用 @ConfigurationProperties 注解读取配置文件,就不需要加 @RefreshScope 注解。

@ConfigurationProperties

在 user-service 服务中,添加一个 PatternProperties 类,读取 patterrn.dateformat 属性

package cn.itcast.user.config;
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    public String dateformat;
}
-----controller------

package cn.itcast.user.web;

@Autowired
private PatternProperties patternProperties;

@GetMapping("now2")
public String now2(){
    //格式化时间
    return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.dateformat));
}
3、配置共享

其实在服务启动时,nacos 会读取多个配置文件,例如:

[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml

[spring.application.name].yaml,例如:userservice.yaml

这里的 [spring.application.name].yaml 不包含环境,因此可以被多个环境共享

添加一个环境共享配置:

我们在 nacos 中添加一个 userservice.yaml 文件:

在 user-service 中读取共享配置
在 user-service 服务中,修改 PatternProperties 类,读取新添加的属性:

在 user-service 服务中,修改 UserController,添加一个方法:

测试: 运行两个 UserApplication,使用不同的profile

修改 UserApplication2 这个启动项,改变其profile值:

这样,UserApplication(8081) 使用的 profile 是 dev

UserApplication2(8082) 使用的 profile 是test

启动 UserApplication 和 UserApplication2
访问地址:http://localhost:8081/user/prop,结果:
可以看出来,不管是 dev,还是 test 环境,都读取到了 envSharedValue 这个属性的值。


上面的都是同一个微服务下,那么不同微服务之间可以环境共享吗?

通过下面的两种方式来指定:

extension-configs
shared-configs

spring: 
  cloud:
    nacos:
      config:
        file-extension: yaml # 文件后缀名
        extends-configs: # 多微服务间共享的配置列表
          - dataId: common.yaml # 要共享的配置文件id
spring: 
  cloud:
    nacos:
      config:
        file-extension: yaml # 文件后缀名
        shared-configs: # 多微服务间共享的配置列表
          - dataId: common.yaml # 要共享的配置文件id
配置的优先级:

4、搭建Nacos集群 1. 搭建mysql集群并初始化数据库表 2. 下载解压nocos 3. 修改集群配置节点信息、数据库配置

第一:
进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf:
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847

第二:
然后修改application.properties文件,添加数据库配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

4. 分别启动多个nacos节点

然后分别修改三个文件夹中的application.properties,server.port=8845、46/47

5. nginx反向代理

修改conf/nginx.conf文件,配置如下:

upstream nacos-cluster {
    server 127.0.0.1:8845;
	server 127.0.0.1:8846;
	server 127.0.0.1:8847;
}

server {
    listen       80;
    server_name  localhost;

    location /nacos {
        proxy_pass http://nacos-cluster;
    }
}
idea代码中application.yml文件配置如下:

spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址

而后在浏览器访问:http://localhost/nacos即可。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777730.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号