目录
一、 什么是注册中心(服务治理)
二、为什么要用注册中心
三、主流的注册中心
四、Linux安装nacos
五、nacos的使用,添加nacos依赖
六、服务之间的调用
一、 什么是注册中心(服务治理)
服务注册:服务提供者provider,启动的时候向注册中心上报自己的网络信息
服务发现:服务消费者consumer,启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络信息
核心:服务管理,是有个服务注册表,心跳机制动态维护,服务实例在启动时注册到服务注册表,并在关闭时注销。
二、为什么要用注册中心
微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大问题
三、主流的注册中心
主流的注册中心:zookeeper、Eureka、consul、etcd、Nacos
AlibabaCloud搭配最好的是Nacos,且服务的注册发现之外,还支持动态配置服务
nacos图片 ,参考官网
四、Linux安装nacos
解压安装包 nacos-server-2.0.2.zip unzip nacos-server-2.0.2.zip
进入bin目录
启动 sh startup.sh -m standalone
访问 localhost:8848/nacos
默认账号密码 nacos/nacos
五、nacos的使用,添加nacos依赖
pom.xml
<!--锁定版本-->
<dependencyManagement>
<dependencies>
<!--https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/2.3.3.RELEASE-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies/Hoxton.SR8-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies/2.2.1.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--添加nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置nacos的地址:
server:
port: 9000
spring:
application:
name: wnn-user-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
启动类增加注解:
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
//开启服务发现
@EnableDiscoveryClient
六、服务之间的调用
使用nacos做服务间的调用,首先把相关服务按第五步骤的配置配好
订单服务中,根据id 请求视频服务的接口
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("query")
public VideoOrder query(int videoId){
VideoOrder videoOrder = new VideoOrder();
videoOrder.setVideoId(videoId);
List<ServiceInstance> list = discoveryClient.getInstances("wnn-video-service");
ServiceInstance serviceInstance = list.get(0);
Video video = restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+
"/api/v1/video/find_by_id?videoId="+videoId,Video.class);
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setVideoId(video.getId());
return videoOrder;
}
注册到nacos的2个服务
使用这种方法带来的问题:无法做负载均衡 。比如无法按照节点轮询/weight 权重配置/固定分发等来根据业务需求调用相应接口
解决方法:
引入Ribbon 或者 Feign
https://blog.csdn.net/wnn654321/article/details/122290206