“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第6篇文章,点击查看活动详情”
Nacos: 注册中心,解决服务注册与发现
Ribbon: 客户端的负载均衡器,解决服务集群的负载均衡
SpringCloud实践系列(三):OpenFeign服务调用
OpenFeign:声明式的HTTP客户端,服务远程调用
Nacos:配置中心,中心化管理配置文件
Sentinel:微服务流量卫兵,以流量为入口,保护微服务,防止出现服务雪崩
SpringCloud实践系列(六):Gateway网关(待更新)
Gateway: 微服务网关,服务集群的入口,路由转发以及负载均衡(结合Sentinel)
SpringCloud实践系列(七):Sleuth链路追踪(待更新)
Sleuth: 链路追踪,链路快速梳理、故障定位等
SpringCloud实践系列(八):Seata分布式事务(待更新)
Seata: 分布式事务解决方案
一、概述
1.1、什么是Nacos
Nacos可用于微服务的注册中心、配置中心
【注册中心】
用于微服务的注册,解决微服务之间相互负载均衡的调用问题的组件之一
【微服务之间相互负载均衡的调用】
注册中心 + 负载均衡器 + 服务远程调用
1.2、Nacos功能
1.3、Nacos注册中心原理图
二、安装使用
2.1、安装
-
安装
-
启动
cd nacos/bin sh startup.sh -m standalone -
登录
# 登录网页用户名 nacos nacos
2.2、问题解决
mac升级后无法启动nacos
# 查看日志报错
/Library/Internet: No such file or directory
# 原因是
/usr/libexec/java_home -V
# 可以查到有两条地址,第一条是系统默认的,第二条是自己的,由于第一条在Internet后边有空格,导致我们的报错
Matching Java Virtual Machines (2):
1.8.211.12 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
1.8.0_211 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
# 修改nacos的startup.sh文件
vi startup.sh
/done # 搜一下定位到这里
done
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
# 把done下的第一条,JAVAHOME地址,改为我们上边查到的自己的jdk地址,保存
done
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
export JAVA="$JAVA_HOME/bin/java"
# 重启即可
sh startup.sh -m standalone
三、快速开始
引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springboot端点监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--nacos 注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
启动类加注解
// 启动类上开启服务注册与发现功能
@EnableDiscoveryClient
3.1、服务注册
在配置文件中配置nocos相关参数即可
-
配置注册服务
spring: application: name: cloud-goods # 服务名 cloud: nacos: discovery: server-addr: localhost:8848 # 指定nacos-server的地址 username: nacos password: nacos server: port: 9001 -
提供服务
import com.decade.Goods; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("goods") public class GoodsController { @GetMapping("fingById/{id}") public Goods findById(@PathVariable String id) { System.out.println("id: " + id); return new Goods("《java开发手册》", 99); } } -
nacos中查看
3.2、服务发现
-
引入RestTemplate
📢要加@LoadBalanced注解,不然url中不能使用服务名,会报java.net.UnknownHostException:服务名
import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration public class ApiConfig { @Bean @LoadBalanced public RestTemplate restTemplate(ClientHttpRequestFactory factory) { return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { //默认的是JDK提供http连接,需要的话可以通过setRequestFactory方法替换为例如Apache HttpComponents、Netty或OkHttp等其它HTTP library。 SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(5000); factory.setConnectTimeout(5000); return factory; } } -
服务调用
import java.util.HashMap; import java.util.Map; @RestController @AllArgsConstructor @RequestMapping("order") public class OrderController { private RestTemplate restTemplate; @PostMapping("save/{id}") public Map save(@PathVariable String id) { // 1、使用服务名(cloud-goods),远程调用商品详情 String url = "http://cloud-goods/goods/fingById/" + id; Goods goods = restTemplate.getForObject(url, Goods.class); // 2、保存订单 System.out.println("保存" + goods.getGoodsName() + "订单完成"); // 3、返回 return new HashMap() {{ put("code", 200); put("msg", "success"); }}; } } -
测试负载均衡
修改服务提供者的提示
import com.decade.Goods; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("goods") public class GoodsController { @GetMapping("fingById/{id}") public Goods findById(@PathVariable String id) { System.out.println("id: " + id); // 不同名,用于区分服务 return new Goods("《服务9001》", 99); } }测试
访问http://localhost:9003/order/save/12,可以看到:两个服务1:1的被调用
四、nacos领域模型
nacos的服务由三元组唯一确定:namespace、group、servicename
nacos的配置中心由三元组唯一确定:namespace、group、service/dataId
不同的namesapce、group都是相互隔离的
4.1、配置namespace和group
-
配置namespace
-
配置group
group直接在代码里指定,不需要配置
4.2、发布服务到不同namespace&group
只需修改配置即可,下面将goods服务一个节点放到dev下
spring:
application:
name: cloud-goods # 服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 指定nacos-server的地址
username: nacos
password: nacos
namespace: dev # 服务发布到指定的namespace,默认是public
group: my-group # 服务发布到指定的group,默认是DEFAULT_GROUP
server:
port: 9002
测试服务调用,由于不属于同一个namespace所以,无法被调用了
五、Nacos集群简述
集群由DNS域名进入----->nginx负载分配到不同nacos节点上
![]()
-
在nginx里配置,三个服务对应一个路径
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 www.test.com; location /nacos { proxy_pass http://nacos-cluster; } } -
在服务注册时,把配置文件的server-addr: localhost:8848换成域名
spring: application: name: cloud-goods # 服务名 cloud: nacos: discovery: server-addr: www.test.com/nacos # 指定nacos-server的地址 username: nacos password: nacos server: port: 9002