1:微服务是架构风格
2:把一个项目拆分成多个服务 服务独立运行
spring cloud1: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("删除多个视频出错");
}
}



