项目[ac-mall-cloud]各module注册到Nacos服务,并通过Nacos服务名访问接口
Nacos官网文档
Nacos官方GitHub地址
Nacos官方下载地址
1、一个更易于构建云远程应用的动态服务发现,配置管理和服务管理平台
2、Nacos就是注册中心 + 配置中心的组合 等价于 Nacos = Eureka + Config + Bus
1、替代Eureka做服务注册中心
2、替代Config做服务配置中心
P(分区容错):一般是针对多节点部署的系统,分区指网络分区(由于网络原因节点之间无法通信同步数据),容错指系统节点出现分区了对外依然要能提供服务,不能说分区了导致整个系统不能提供服务了。
在满足P的前提下,Client发一条数据给节点1,因为分区产生这条数据暂时无法同步给节点2。如果要保证整个分布式系统的数据一致性(C),肯定要牺牲掉可用性(A),也就是整个分布式系统对外暂时不可用,不然Client对节点1和节点2的这条数据查询的结果就不一致了。同样的道理,如果要保证A那肯定要牺牲掉C了,因为数据还没在节点间同步,Client查询节点1和节点2的这条数据结果肯定不一样。
CAP原则是三选二,BASE原则是CAP的折中,C、A、P三个都要,但不用100%的保证每一个原则,分布式系统肯定优先保证P,多数时候是在C和A之间做权衡选择
脑裂:集群(Master-Slave的情况)的脑裂通常是发生在节点之间通信不可达(分区)的情况下,集群会分裂成不同的小集群,小集群各自选出自己的master节点,导致原有的集群出现多个master节点的情况。
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
可参考Nacos 快速开始、Nacos Spring Cloud 快速开始
1、本地Java8+Maven环境已经OK
2、先从官网下载Nacos Nacos官方下载地址
3、解压安装包
4、启动Nacos(错误示范)
在Nacos的低版本中,可以直接点击运行bin目录下的startup.cmd来启动Nacos,但在高版本中,则会启动失败,原因是高版本默认采用了集群模式,用到了数据库,而我们没有配置数据库,因此启动失败。
5、启动方式一
打开cmd命令窗口,在启动命令中指定单机模式运行
cd D:installnacos-server-2.0.0nacosbin
startup.cmd -m standalone
运行成功后访问http://localhost:8848/nacos
默认账号nacos nacos
6、启动方式二
用编辑器打开startup.cmd文件,找到set MODE="cluster"
,修改成set MODE="standalone"
,将默认的集群模式改成单机模式。此时再双击startup.cmd就可以启动Nacos了
1、将Nacos安装包文件上传到远程服务器
scp -r D:/install/nacos-server-2.0.0 root@[47.105.146.74](mailto:root@47.105.146.74):/data/nacos-server-2.0.0
2、登录远程服务器,启动Nacos
ssh root@47.105.146.74
输入密码
cd /data/nacos-server-2.0.0/nacos/bin
ubuntu 启动命令
bash startup.sh -m standalone
linux 启动命令
sh startup.sh -m standalone
可以通过命令查看启动日志
tail -f /data/nacos-server-2.0.0/nacos/logs/start.out -n 1000
4、Nacos控制台效果
在父级工程 [ac-mall-cloud] pom.xml中引入Nacos依赖
com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery${alibaba.cloud.version}
父级工程 [ac-mall-cloud] pom.xml全配置如下
4.0.0org.exampleac-mall-cloud1.0-SNAPSHOTuser-serviceproduct-serviceorder-servicepom1.8Greenwich.SR18.0.173.2.01.1.102.2.4.RELEASE2.1.0.RELEASE1.18.10org.springframework.bootspring-boot-starter-parent${boot.version}pomimportorg.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimportcom.alibaba.cloudspring-cloud-alibaba-dependencies${alibaba.cloud.version}pomimportcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery${alibaba.cloud.version}com.baomidoumybatis-plus-boot-starter${mybatis.plus.version}com.alibabadruid-spring-boot-starter${druid.version}mysqlmysql-connector-java${mysql.version}org.projectlomboklombok${lombok.version}providedorg.projectlomboklombok1.18.10providedorg.springframework.bootspring-boot-maven-plugin
1、在module [user-service]pom.xml中引入Nacos依赖
com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery
module [user-service]pom.xml全配置如下
ac-mall-cloudorg.example1.0-SNAPSHOT4.0.0org.acuser-serviceorg.springframework.bootspring-boot-starter-webcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery
2、在module [user-service]application.yml配置文件中配置Nacos注册中心信息
spring:
cloud:
nacos:
discovery:
server-addr: 47.105.146.74:8848
module [user-service]application.yml全配置如下
server:
port: 8010
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 47.105.146.74:8848
3、补充说明
从Spring Cloud Edgware开始,@EnableDiscoveryClient
可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。因此本项目中不需要在UserApplication启动类上加@EnableDiscoveryClient
注解
module [order-service] 配置与[user-service]一样,此处省略
配置完成后,登录Naocs控制台,效果如下
将RestTemplate由IP访问,改成用服务名访问
@Service
public class OrderServiceImpl implements IOrderService {
@Autowired
OrderDao orderDao;
@Autowired
RestTemplate restTemplate;
//final static String USER_SERVICE_URL="http://127.0.0.1:8010/users/{userId}";
final static String USER_SERVICE_URL="http://user-service/users/{userId}"; //用服务名来替换IP
public Order makeOrder(String productId, String userId) {
/**
* RestTemplate是java创造出来的,在java能够访问到网络资源的包是java.net.URLConnenction/Socket
* RestTemplate是对URLConnenction的封装
* apache--HttpClient 也是对URLConnenction/HttpURLConnenction的封装
* oKHttp 也封装了URLConnenction
* netty/rpc/grpc/thirt/tomcat
*/
// 1、根据用户ID调用用户服务接口数据,查询用户的名字
UserDto userDto = restTemplate.getForObject(USER_SERVICE_URL,UserDto.class,userId);
String userName=userDto.getUserName();
// 2、生成订单
Order order = new Order();
order.setId(UUID.randomUUID().toString());
order.setCreateTime(new Date());
order.setPriceFen(1600L);
order.setUserId(userId);
order.setUserName(userName);
order.setProductId(productId);
order.setOrderNo(UUID.randomUUID().toString());
// 3、保存数据库
orderDao.insert(order);
return order;
}
}
我们在浏览器中输入访问地址http://127.0.0.1:8020/orders/1/1
发现接口访问失败,控制台打印出异常信息java.net.UnknownHostException: user-service
这是因为RestTemplate无法识别Nacos注册中心中的user-service服务名。
由于Nacos服务注册与发现功能中,默认集成了Ribbon,因此我们可以在RestTemplate添加Ribbon注解,让Ribbon来解决识别服务名的问题。
在module[order-service]的OrderApplication中加入Ribbon注解@LoadBalanced
,代码如下
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class);
}
@Bean
@LoadBalanced // Ribbon负载均衡注解
RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
重启module[order-service],再次访问http://127.0.0.1:8020/orders/1/1
,发现与之前用IP方式通信的效果一样了
在日常使用中常常需要不同的环境,比如日常,预发,线上环境,如果是逻辑隔离可以使用命名空间,Nacos支持命名空间来支持多环境隔离,可以在Nacos控制台创建多个命名空间。如果需要物理隔离,就要部署多套Nacos环境。
在单机模式下,Nacos没有任何依赖,在集群模式下,Nacos依赖Mysql做存储。
Nacos单机模式默认使用内嵌的数据库作为存储引擎,如果想换成自己安装的mysql也可以进行相关的配置。
生产环境使用Nacos为了达到高可用不能使用单机模式,需要搭建nacos集群。
Nacos定义为一个IDC内部应用组件,并非面向公网环境的产品,建议在内部隔离网络环境中部署,强烈不建议部署在公共网络环境。
备注:应用内部流量可以走专用端口,然后在防火墙和安全组指定这个端口只允许你的其他服务器 IP 访问,更多安全配置可参考Nacos 配置安全最佳实践
Nacos服务做集群时,服务A调用服务B,服务B有B1、B2、B3 三个服务,现在B1要更新发布新代码,会有几秒的短暂不可用,如果此时服务A刚好访问的是服务B1,那么对应功能就会出现不可用的情况。其实针对这个问题可用通过Sentinel服务降级与熔断来解决。
项目源码地址
Nacos 配置安全最佳实践