nacos
Spring Cloud相关基础服务组件
服务发现——Netflix Eureka (Nacos)
服务调用——Netflix Feign
熔断器——Netflix Hystrix
服务网关——Spring Cloud GateWay
分布式配置——Spring Cloud Config (Nacos)
消息总线 —— Spring Cloud Bus (Nacos)
基本概念
(1)Nacos 是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
(2)常见的注册中心:
- Eureka(原生,2.0遇到性能瓶颈,停止维护)
- Zookeeper(支持,专业的独立产品。例如:dubbo)
- Consul(原生,GO语言开发)
- Nacos相对于 Spring Cloud Eureka 来说,Nacos 更强大。Nacos = Spring Cloud Eureka + Spring Cloud Config Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
(3)Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。
Nacos主要提供以下四大功能:
5. 服务发现和服务健康监测
6. 动态配置服务
7. 动态DNS服务
8. 服务及其元数据管理
Nacos结构图:
Nacos下载和安装
(1)下载地址和版本
下载地址:https://github.com/alibaba/nacos/releases
下载版本:nacos-server-1.1.4.tar.gz或nacos-server-1.1.4.zip,解压任意目录即可
(2)启动nacos服务
- Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式)
启动命令:sh startup.sh -m standalone
- Windows
启动命令:cmd startup.cmd
或者双击startup.cmd运行文件。
访问:http://localhost:8848/nacos
用户名密码:nacos/nacos
服务注册
实例场景
如图片所示,项目中有两个服务service_edu和service_vodd。service_vodd主要的功能是删除阿里云的视频服务。service_edu里主要是删除课程的章节和小节,一个课程有多个章节,一个章节里有多个小节,每个小节对应着视频。现在我们要把小节删除,把里面对应的视频删除,因为这里是两个服务,因此我们需要用到远程调用,首先我们应该把两个服务在nacos中注册。
1、在service模块配置pom
配置Nacos客户端的pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、添加服务配置信息
配置application.properties,在客户端微服务中添加注册Nacos服务的配置信息
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、添加Nacos客户端注解
在客户端微服务启动类中添加注解
@EnableDiscoveryClient
4、启动客户端微服务
启动注册中心,启动已注册的微服务,可以在Nacos服务列表中看到被注册的微服务
这里我们已经把服务在nacos中注册完成,接下来就是service_edu调用service_vodd.
Feign
基本概念
- Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
- Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
- Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
- Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
- Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
实现服务调用
1、需求
删除小节时删除对应的视频
2、在service模块添加pom依赖
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3、在调用端的启动类添加注解
@EnableFeignClients
4、创建包和接口
创建client包
@FeignClient注解用于指定从哪个服务中调用功能 ,名称与被调用的服务名保持一致。
@GetMapping注解用于对被调用的微服务进行地址映射。
@PathVariable注解一定要指定参数名称,否则出错
@Component注解防止,在其他位置注入CodClient时idea报错
//删除视频远程服务
@FeignClient("service-vodd")
@Component
public interface VodClient {
//定义要调用的方法的路径
@DeleteMapping("/eduvod/video/removeAlyVideo/{id}")
public R removeAlyVideo(@PathVariable("id") String id);
@DeleteMapping("/eduvod/video/delete-batch")
public R removevideoList(@RequestParam("videoIdList") List<String > videoIdList);
}
5、调用微服务
@Service
public class EduVideoServiceImpl extends ServiceImpl<EduVideoMapper, EduVideo> implements EduVideoService {
//注入服务
@Autowired
private VodClient vodClient;
//根据课程id删除小节,一个课程中有很多视频
@Override
public void removeVideoByCourseId(String courseId) {
//根据课程id查询所有视频列表
QueryWrapper<EduVideo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("course_id",courseId);
queryWrapper.select("video_source_id");
List<EduVideo> videoList = baseMapper.selectList(queryWrapper);
//得到所有视频列表的云端视频id
List<String> videoSourceIdList = new ArrayList<>();
for (int i = 0; i < videoList.size() ; i++) {
EduVideo video = videoList.get(i);
String videoSourceId = video.getVideoSourceId();
if(!StringUtils.isEmpty(videoSourceId)){
videoSourceIdList.add(videoSourceId);
}
}
//调用vod服务删除远程视频
if(videoSourceIdList.size() > 0){
vodClient.removevideoList(videoSourceIdList);
}
//删除video表记录
QueryWrapper<EduVideo> queryWrapper2 = new QueryWrapper<>();
queryWrapper2.eq("course_id", courseId);
Integer count = baseMapper.delete(queryWrapper2);
}
//删除小节时候,同时把里面视频删除
@Override
public void removeVideoById(String id) {
//查询云端视频id
EduVideo video = baseMapper.selectById(id);
String videoSourceId = video.getVideoSourceId();
//删除视频资源
if(!StringUtils.isEmpty(videoSourceId)){
vodClient.removeAlyVideo(videoSourceId);
}
//删除小节
Integer result = baseMapper.deleteById(id);
}
}
这里为止,完成了服务注册和调用的基本使用,下面会整合Hystrix。