使用SpringCloud需要引入各组件的依赖
组件:SpringCloud-Alibaba-Nacos
依赖
注册中心
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置中心
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注:使用SpringCloud-Alibaba-Nacos需要先下载并启动Nacos-Server
涉及注解
1.@EnableDiscoveryClient: 将服务注册到注册中心
- 例如
@EnableDiscoveryClient //将服务注册到注册中心
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
组件:SpringCloud-Feign
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
涉及注解
1.@EnableFeignClients: 写在主程序上来支持feign
- 例如
@EnableFeignClients(value = "com.zpf.gulimall.member.feign") //开启Feign功能 并且扫描路径为com.zpf.gulimall.member.feign
@EnableDiscoveryClient //将服务注册到注册中心
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
2.@FeignClient: 实现服务降级
- 例如:在com.zpf.gulimall.member.feign下有CouponFeign 接口
//value:调用的服务名 fallbackFactory:降级类/接口
@FeignClient(value = "gulimall-coupon",fallbackFactory =Coupon2Feign.class )
public interface CouponFeign {
@RequestMapping("coupon/coupon/list")
public R list(@RequestParam Map<String, Object> params);
}
3.@RibbonClient: 设置负载均衡规则
- 例如
//name 来指定调用的服务名称 configuration指定策略bean
@RibbonClient(name = "gulimall-coupon",configuration =RibbonConfig.class)
@EnableFeignClients(value = "com.zpf.gulimall.member.feign") //开启Feign功能 并且扫描路径为com.zpf.gulimall.member.feign
@EnableDiscoveryClient //将服务注册到注册中心
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
-----------------------------------------------------------------------
负载均衡规则类如下(可自己实现需要实现IRule接口 ):
@Configuration
public class RibbonConfig {
@Bean
public IRule getRibbon()
{
return new RoundRobinRule();//轮询
//return new RandomRule();//随机
}
}
4.@RequestMapping: 调用不同服务的接口
- 例如
@FeignClient(value = "gulimall-coupon" )
public interface Coupon2Feign {
@RequestMapping("coupon/coupon/list")//调用服务的全路径
public R list(@RequestParam Map<String, Object> params);
}
5.@LoadBalanced: 在使用 RestTemplate 的时候 如果 RestTemplate 上面有 这个注解,那么 这个 RestTemplate 调用的 远程地址,会走负载均衡器
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
组件:SpringCloud-hystrix
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
涉及注解
1.@EnableCircuitBreaker: 开启断路器功能
- 例如
//开启断路器
@EnableCircuitBreake
//name 来指定调用的服务名称 configuration指定策略bean
@RibbonClient(name = "gulimall-coupon",configuration =RibbonConfig.class)
@EnableFeignClients(value = "com.zpf.gulimall.member.feign") //开启Feign功能 并且扫描路径为com.zpf.gulimall.member.feign
@EnableDiscoveryClient //将服务注册到注册中心
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
2.@DefaultProperties: 全局熔断
- 例如
@Controller
@RequestMapping("user")
@DefaultProperties(defaultFallback = "methodFullBack")//全局熔断
public class SysUserController {
@Autowired
private UserClient userClient;
public String methodFullBack() throws IOException {
return "服务器发生错误,请稍后重试。。。";
}
@GetMapping("getAllV4/{id}")
@ResponseBody
public String getAllV4(@PathVariable(value = "id") Long id) {
SysUser user = userClient.getUser(id);
return user.toString();
}
}
3.@HystrixCommand:局部熔断
- 例如
@GetMapping("getAllV3")
@ResponseBody
@HystrixCommand(fallbackMethod = "MethodFullBack")//fallbackMethod:调用失败的时候触发熔断方法
public String MethodV3() throws IOException {
ResponseEntity<String> forEntity = restTemplate.getForEntity("http://DomeService/main/getAll",String.class);
return forEntity.toString();
}
public String MethodFullBack() throws IOException {
return "服务器发生错误,请稍后重试。。。";
}
组件:SpringCloud-geteway
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>