栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring cloud------nacos

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring cloud------nacos

spring cloud 微服务

1:微服务是架构风格

2:把一个项目拆分成多个服务 服务独立运行

spring cloud

1:spring cloud并不是一种技术,是很多技术总称,很多框架集成

2:spring cloud里面有很多框架,使用里面的那些框架实现微服务操作

3:使用spring cloud,需要依赖spring boot

其内的相关组件

服务发现(注册中心)—Netflix Eureka (Nacos)

服务调用—Netflix Feign

熔断器—Netflix Hystrix

服务网关—Spring Cloud GateWay

分布式配置—Spring Cloud Config (Nacos)

消息总线—Spring Cloud Bus (Nacos)

1:Nacos注册中心介绍

两个模块,没有联系,也不引入依赖

将两个模块都注册到注册中心,即可相互调用

2:Nacos注册中心使用

下载:官网下载即可,解压后启动运行文件即可

Windows启动的是:startup.cmd

Linux启动的是:startup.sh

访问:http://localhost:8848/nacos

​ 用户名密码:nacosnacos

2.1:把互相调用的服务在nacos进行注册

1:引入依赖

        
        
            org.springframework.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

2:在所要使用的模块添加配置

# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3:所用模块启动类添加注解

@EnableDiscoveryClient  //nacos注册

即可发现在nacos中就有了

2.2:使用feign调用

1:引入依赖

        
        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

2:在调用端启动类上添加注解

@EnableFeignClients     //nacos的调用端注解

3:在调用端创建个接口,使用注解指定调用服务名称,定义调用的方法路径

@FeignClient("service-vod")     //用以调用service-vod中的方法
@Component
public interface VodClient {

    //再将所要调用的方法前面那个放进来,路径要写全
    //根据视频id删除阿里云视频
    @DeleteMapping("/eduvod/video/removeAlyVideo/{id}")
    //注:这个注解必须要指定名称
    public R removeAlyVideo(@PathVariable("id") String id);
}

4:现在就可在这个模块中,调用另外一个模块

例:先注入,注入的是本模块所定义的调用端的那个接口注入即可

3:springcloud调用接口过程

第一步:接口化请求调用

​ 就是在调用端建个接口,使用注解指定调用服务名称,定义调用的方法路径

第二步:Feign组件

​ 找到服务,根据名字做调用

第三步:Hystrix熔断器

​ 调用端调用服务,但是当服务挂掉后,就需要熔断器,将那个调用熔断

第四步:Ribbon负载均衡器

​ 请求通过,则通过Ribbon负载均衡器,挑选合适的服务提供端

第五步:HttpClient最终调用

​ 执行请求,最终调用

4:Hystrix熔断器及使用

调用端调用服务,但是当服务挂掉后,就需要熔断器,将那个调用熔断,让其不再调用

也可设置启动时间延长(启动是有时间限制,超出即失败)

1:引入依赖

        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
        
        

        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-hystrix
        

2:调用端写入配置,开启熔断机制

#开启熔断机制
feign.hystrix.enabled=true
# 设置hystrix超时时间,默认1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000

3:在创建的interface后,还需要创建interface对应的实现类

​ 在实现类中实现方法,出错了实现内容

​ 其内也就是和interface中对应的,改个输出即可

@Component
public class VodFileDegradeFeignClient implements VodClient{
    @Override
    public R removeAlyVideo(String id) {
        return R.error().message("删除视频出错");
    }

    @Override
    public R deleteBatch(List videoIdList) {
        return R.error().message("删除多个视频出错");
    }
}

4:interface更改

​ 添加了后面那个,表示可执行熔断

@FeignClient(name = "service-vod",fallback = VodFileDegradeFeignClient.class)     //用以调用service-vod中的方法
例:

首先将两个模块进行nacos,让其可互相调用

被调用模块service-vod中,在service-edu中调用那两个方法
@RestController
@RequestMapping("/eduvod/video")
@CrossOrigin
public class VodController {

    @Autowired
    private VodService vodService;


    //根据视频id删除阿里云视频
    @DeleteMapping("removeAlyVideo/{id}")
    public R removeAlyVideo(@PathVariable String id) {
        try {
            //初始化对象
            DefaultAcsClient client = InitVodCilent.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET);
            //创建删除视频request对象
            DeleteVideoRequest request = new DeleteVideoRequest();
            //向request设置视频id
            request.setVideoIds(id);
            //调用初始化对象的方法实现删除
            client.getAcsResponse(request);
            return R.ok();
        }catch(Exception e) {
            e.printStackTrace();
            throw new GuliException(20001,"删除视频失败");
        }
    }


    //删除多个阿里云视频的方法
    //参数多个视频id  List videoIdList
    @DeleteMapping("delete-batch")
    public R deleteBatch(@RequestParam("videoIdList") List videoIdList) {      //那个是定义个名称
        vodService.removeMoreAlyVideo(videoIdList);
        return R.ok();
    }

}
在service-edu中,创建一个client模块,在其下面进行创建

VodClient

@FeignClient(name = "service-vod",fallback = VodFileDegradeFeignClient.class)     //用以调用service-vod中的方法  //后面的那个是拦截器
@Component
public interface VodClient {

    //再将所要调用的方法前面那个放进来,路径要写全
    //根据视频id删除阿里云视频
    @DeleteMapping("/eduvod/video/removeAlyVideo/{id}")
    //注:这个注解必须要指定名称
    public R removeAlyVideo(@PathVariable("id") String id);


    //删除多个视频
    @DeleteMapping("/eduvod/video/delete-batch")
    public R deleteBatch(@RequestParam("videoIdList") List videoIdList);
}

VodFileDegradeFeignClient //拦截器

@Component
public class VodFileDegradeFeignClient implements VodClient{
    @Override
    public R removeAlyVideo(String id) {
        return R.error().message("删除视频出错");
    }

    @Override
    public R deleteBatch(List videoIdList) {
        return R.error().message("删除多个视频出错");
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/831449.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号