Nacos安装
nacos启动:在bin目录下打开cmd输入:startup.cmd -m standalone
页面地址:http://192.168.216.1:8848/nacos/index.html
默认用户及密码:nacos
nacos注册中心
一、在cloud-demo父工程中添加spring-cloud-alibaba的管理依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
客户端添加client依赖
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
二、在yml中配置cloud
spring:
application:
name: userservice
datasource:
url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
username: root
password: 12345678
driver-class-name: com.mysql.jdbc.Driver
cloud:
nacos:
server-addr: localhost:8848
Nacos服务分级存储模型
配置集群实例
修改application.yml
cloud:
nacos:
discovery:
cluster-name: HZ #自定义的集群名称
选择两个实例启动后,将cluster-name更改名字并启动另外一个
根据集群负载均衡
在order模块的application.yml加入
cloud:
nacos:
discovery:
cluster-name: HZ
server-addr: localhost:8848
在order-service中设置负载均衡的IRule为NacosRule,这个规则会优先寻找与自己同集群的服务
userservice: #要做配置的微服务名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
Nacos服务实例的权重设置
Nacos控制台可以设置实例的权重值,0-1之前
同集群内的多个实例,权重越高被访问的频率越高
权重设置为0则完全不会被访问,可以丝滑升级
环境隔离-namespace
①在nacos控制台创建一个命名空间,保存后生成一个id
②在service的appllication.yml中添加namespace:生成的id
同一个namespace才能访问
默认情况下,所有实例都是临时实例,临时实例采用心跳监测,不跳了就干掉。非临时实例是nacos主动问还活着不,甚至等它变健康。对服务消费者是主动推送(push和pull都有)变更消息。当集群中存在非临时实例时,采用cp模式,eureka采用ap模式
cloud:
nacos:
discovery:
cluster-name: HZ
namespace: e2c424f6-3a00-4b96-a95c-e8bba723ff3b
ephemeral: false #是否是临时实例
Nacos配置列表
在nacos页面的配置列表添加配置
项目启动,引导文件bootstrap.yml文件,优先级高与application.yml,读取nacos中配置文件,读取本地配置文件application.yml,创建spring容器,加载bean
统一配置管理
2.引入nacos配置管理客户端依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3.在resourse下新建bootstrap.yml文件
spring:
application:
name: userservice
profiles:
active: dev
cloud:
nacos:
server-addr: localhost:8848
config:
file-extension: yml
4.将application中重复的内容删掉
5.启动服务,获取配置列表中的参数,尝试是否能取出
实现热更新配置:
第一种:在@value所在的类添加@RefreshScope
第二种:使用@ConfigurationProperties(prefix="pattern")
多环境配置共享
环境配置优先级:带环境的配置文件>不带环境的配置文件>本地配置环境
nacos集群结构
连接上数据库
1.修改cluster.conf.properties为cluster.conf,将服务ip及端口添加
2.修改application.properties文件
3.将nacos复制三份分别命名:nacos1、nacos2、nacos3
4.修改conf中的application.properties端口号,改为8845、8846、8847
5.启动三个nacos:startup.cmd
6.解压nginx,将它放在nacos同目录下,修改ngnix的config文件,配置下边,粘贴到http内部。启动nginx服务start nginx.exe
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 nacos-cluster;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
-
如果nginx -s stop还能访问页面,使用
tasklist /fi "imagename eq nginx.exe"
查看,并nginx-1.18.0>tasklist -t -f /pid 11572
杀掉进程
在网页中输入ip地址:端口号/nacos跳转,登录后配置列表添加配置,会自动在表中生成数据
Feign
声明式客户端
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.开启注解:启动类添加@EnableFeignClients
注解
3.编写feign客户端,创建client包,编写UserClient接口
package cn.itcast.order.client;
import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @ClassName UserClient
* @Description TODO
* @date 2024/8/29 14:12
* @Version 1.0
*/
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
自定义feign配置
方式一:配置文件方式
①全局生效:
feign:
client:
config:
default:
logger-level: FULL
②局部生效:
feign:
client:
config:
userservice:#这里写服务名称就是局部生效
logger-level: FULL
方式二:java代码
package cn.itcast.order.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
/**
* @ClassName DefaultFeignConfiguration
* @Description TODO
* @date 2024/8/29 15:31
* @Version 1.0
*/
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
启动:使用@FeignClient是局部使用,@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)全局使用
Feign的最佳实践
①:让Controller和feignClient继承同一接口
②:将feignClient、pojo、feign的默认配置都定义到一个项目中,供所有消费者使用
新建moudlefeign-api
,把order中的user类,client,config移到feign-api中,并将feign-api导入到order的pom文件中
-
当定义的feignClient不在SpringBootApplication的扫描包范围时,这些feignClient无法使用。解决方式有两种:①:指定FeignClient所在包:
@EnableFeignClient(basePackages="cn.itcast.fign.clients")
②:指定FeignClient字节码:@EnableFeignClients(clients = UserClient.class)