通过上面的调用图会发现,除了微服务,还有一个组件是服务注册中心,它是微服务架构非常重要
的一个组件,在微服务架构里主要起到了协调者的一个作用。注册中心一般包含如下几个功能:
\1. 服务发现:
服务注册:保存服务提供者和服务调用者的信息
服务订阅:服务调用者订阅服务提供者的信息,注册中心向订阅者推送提供者的信息
\2. 服务配置:
配置订阅:服务提供者和服务调用者订阅微服务相关的配置
配置下发:主动将配置推送给服务提供者和服务调用者
\3. 服务健康检测
检测服务提供者的健康情况,如果发现异常,执行服务剔除
常见的注册中心组件有哪些?
nacos:—它是阿里巴巴的组件.-----70%
eureka: —它是netflix公司的组件—该组件已经停止更新—29% [早期的微服务项目]
zookeeper—它是apache公司的
consul:
一、什么是Nacos?🍉
概览
欢迎来到 Nacos 的世界!
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos文档https://github.com/alibaba/nacos/releases
二、Nacos的使用🍉
1.下载Nacos🥝
Nacos官方地址:Nacos快速开始
Nacos官方下载地址:https://github.com/alibaba/nacos/releases
Nacos码云下载地址(更快):https://gitee.com/mirrors/Nacos/releases
我这里下载的是1.4版本
下载好把压缩包解压即可
2.启动Nacos🥝
默认它启动模式为–集群模式—修改它为单机模式
打开解压的文件夹
打开bin目录下的startup.cmd 脚本文件
更改脚本命令信息
双击脚本命令启动Nacos
访问:
http://localhost:8848/nacos
账号和密码: nacos
登录成功
三、在微服务项目中使用Nacos🍉
此次演示工程为上一篇文章创建的微服务工程
1.微服务注册和拉取注册中心的内容🥝
在生产方使用
(1)引入nacos的依赖🍓
<!--nacos的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
(2) 配置注册中心的地址–默认本地端口号8848🍓
#为微服务定义名称
spring.application.name=lzq01
#nacos注册中心的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
#为微服务创建组名
spring.cloud.nacos.discovery.group=AAA
(3)查看🍓
2.消费端使用🥝
(1)引入nacos的依赖🍓
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
(2)编写配置文件🍓
#为微服务定义名称
spring.application.name=lzq02
#nacos注册中心的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
#是否在Nacos登记 默认为true登记
spring.cloud.nacos.discovery.register-enabled=false
(3)更改controller层代码🍓
package com.lzq.controller;
import com.lzq.Order;
import com.lzq.Product1;
import com.lzq.service.OrderSercice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.Random;
@RestController
@RequestMapping
public class OrderController {
@Autowired
private OrderSercice orderSercice;
@Autowired
private RestTemplate restTemplate;
@Autowired//在springcloud中封装一个DiscoveryClient类 该类可以获取注册中心的服务信息
private DiscoveryClient discoveryClient;
@GetMapping("/aaa")
public String insert(int pid,int num){
//通过DiscoveryClient类获取登记名为“lzq01”工程信息
List<ServiceInstance> instances = discoveryClient.getInstances("lzq01");
//通过随机数将随机获取服务器中的工程uri
int i1 = new Random().nextInt(instances.size());
ServiceInstance serviceInstance = instances.get(i1);
String path = serviceInstance.getUri().toString();
System.out.println(pid);
//构建一个订单对象
Order order=new Order();
order.setUid(1);//未来登录后一定能获取当前用户信息。
order.setUsername("阿娇");
order.setNumber(num);
//商品信息---调用商品微服务的接口。---如何调用商品微服务的接口?--远程调用。[1]借助rabbitmq [2]http远程调用【在java端模拟浏览器调用】。
//spring封装了http远程调用 RestTemplate.默认该类没有交于spring容器管理. 创建一个配置类 写一个方法@Bean注解
Product1 product = restTemplate.getForObject(path+"/aaa/bbb/"+ pid, Product1.class);
System.out.println(product);
order.setPid(product.getPid());
order.setPname(product.getPname());
order.setPprice(product.getPprice());
int i=orderSercice.inset(order);
return i>0?"下单成功":"下单失败";
}
}