1. 什么是微服务的注册中心
-
微服务架构图
-
什么是注册中心(服务治理)
服务注册:服务提供者provider,启动的时候向注册中心上报自己的网络信息
服务发现:服务消费者consumer,启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络信息
核心:服务管理,是有个服务注册表,心跳机制动态维护,服务实例在启动时注册到服务注册表,并在关闭时注销 -
为什么要用
微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大问题 -
主流的注册中心:zookeeper、Eureka、consul、etcd、Nacos
AlibabaCloud搭配最好的是Nacos,且服务的注册发现之外,还支持动态配置服务
2.AlibabaCloud注册中心Nacos实战
1) 注册中心Nacos介绍
官网:https://nacos.io/zh-cn/
2) 安装JDK
官网: https://www.oracle.com/java/technologies/downloads/
将下载好的的压缩包解压到/home/edric/Tools
修改etc/profile文件末尾追加
export JAVA_HOME=/home/edric/Tools/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
执行 source /etc/profile
执行java -version查看
3)安装Maven
官网:https://maven.apache.org/download.cgi
下载完成后解压文件到/home/edric/Tools
修改etc/profile文件末尾追加
export PATH=$PATH:/home/edric/Tools/maven/bin
执行 source /etc/profile
执行 mvn -version
4)安装nacos
git地址:https://github.com/alibaba/nacos/releases
解压安装包
进入bin目录
启动 sh startup.sh -m standalone
访问 localhost:8848/nacos
默认账号密码 nacos/nacos
注意:
浏览器无法访问git网站,检查浏览器是否设置了代理,更改为不使用代理
本地主机无法访问虚拟机中的nacos,解决方法如下,关闭centos防火墙
#关闭
systemctl stop firewalld service
#开机禁用
systemctl disable firewalld
3.基于Nacos实现订单-视频服务之间的调用
1)视频服务集成Nacos
添加依赖
<!--添加nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置Nacos地址
server:
port: 8000
spring:
application:
name: xdclass-video-service
cloud:
nacos:
discovery:
server-addr: 192.168.3.104:8848
启动类增加注解
@SpringBootApplication
@MapperScan("net.xdclass.dao")
@EnableDiscoveryClient
public class VideoApplication {
public static void main(String[] args) {
SpringApplication.run(VideoApplication.class,args);
}
}
2)订单服务集成Nacos
3)用户服务集成Nacos
4)启动服务
5)服务之间的调用
//OrderController
@RestController
@RequestMapping("api/v1/video_order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/save")
public Object save(int videoId){
//Video video = restTemplate.getForObject("http://localhost:9000/api/v1/video/find_by_id?videoId="+videoId, Video.class);
List<ServiceInstance> list = discoveryClient.getInstances("xdclass-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 videoOrder = new VideoOrder();
videoOrder.setVideoId(video.getId());
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setCreateTime(new Date());
return videoOrder;
}
}
//OrderApplication
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {
public static void main(String [] args){
SpringApplication.run(OrderApplication.class,args);
}
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}