【Spring Cloud】 笔记1

一.Spring Cloud简介

  简单来说,Spring Cloud 就是致力于分布式系统、微服务等的一套在目前非常火热的框架。但它的本身也是一系列框架的有序集合(由多个模块组成)。

  相比较于Dubbo还是有很多不同之处的:例如Dubbo是基于RPC的服务框架,而Spring Cloud是基于RESTful API的服务框架。Dubbo由于是二进制的传,而Spring Cloud是http协议传输等等。

二.Spring Cloud的Eureka组件

  1.Eureka的作用

    Eureka和zookeeper类似,能起到一个服务注册中心的作用

  2.使用Eureka

    在Spring Boot主类中添加@EnableEurekaServer注解即可开启Eureka(注意,需要引入相关的依赖,依赖如下)

 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

  3.Eureka配置

    在application.properties中配置如下

spring.application.name=spring-cloud-eureka
server.port=8060
eureka.instance.hostname=localhost
#配置服务中心  应将下列属性设为false
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
#访问路径
eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/

  4.测试服务中心

    启动Spring Boot项目,访问端口后可以看到如下界面

    

  5.服务提供者

    在项目下新建一个Spring Boot项目的Module,并在主类中添加@EnableEurekaClient注解

    在配置文件中添加如下配置

spring.application.name=spring-cloud-provider
server.port=8061
eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/

    启动项目后发现服务中心多了一个服务提供者,如下图所示

    

  6.服务消费者

    Spring Cloud创建服务消费者有两种方式,分别是使用Ribbon和使用Feign

    1.Ribbon的方式创建服务消费者

    (1)首先引入相关的依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

    (2)在主类中添加@EnableDiscoveryClient注解

    (3)最后在配置文件中配置如下

spring.application.name=spring-cloud-consumer
server.port=8063
eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/

    (4)服务消费者调用服务提供者中的方法

    创建RestTemplate对象,并调用该对象的getForObject方法,例如下列代码

    service层

@Service
public class MyService {
    @Autowired
    private RestTemplate restTemplate;

    public String getPort(){
        //调用服务提供方的方法
        return restTemplate.getForObject("http://spring-cloud-provider:getPort",String.class);
    }
}

    controller层

@RestController
public class MyController {
    @Autowired
    private MyService myService;
@RequestMapping("/getPort") public String getPort(){ return myService.getPort(); } }

    测试结果如下

    

    如果需要配置负载均衡策略,可以在服务消费者中添加一个配置类,再开启一个其他端口的服务提供者即可

@Configuration
public class MyConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

    2.Feign的方式创建服务消费者

    (1)首先引入相关的依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

    (2)然后在主类中添加 @EnableFeignClients 和 @EnableDiscoveryClient 注解,配置文件与Ribbon的方式类似

    (3)服务消费者调用服务提供者中的方法

    在service层中的代码如下

@FeignClient(value = "spring-cloud-provider")
public interface MyService {
    @RequestMapping(value = "getPort" , method = RequestMethod.GET)
    public String getPort();

}

    在controller层中的代码如下

@RestController
public class MyController {
    @Autowired
    private MyService myService;

    @RequestMapping(value = "getPort" , method = RequestMethod.GET)
    public String getPort(){
        return myService.getPort(); } }

     由于Feign的方式本身包含有了Ribbon,也实现了负载均衡,面向接口编程,写起来思路更清晰方便,实际开发中应用更广

三.Spring Cloud 熔断器

  1.Ribbon的方式添加熔断器

    (1)导入相关的依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

    (2)在主类中添加 @EnableHystrix 注解开启熔断器

    (3)修改service层中的方法,在方法上添加 @HystrixCommand 注解,例如

    @HystrixCommand(fallbackMethod = "getError")//如果getPort方法执行失败,会直接熔断该方法并执行getError方法(避免浏览器一直去加载)
    public String getPort(){
        //调用服务提供方的方法
        return restTemplate.getForObject("http://spring-cloud-provider:getPort",String.class);
    }
    public String getError(){
        return String.format("获取失败");
    }

  2.Feign的方式添加熔断器

    (1)Feign自带熔断器,但默认是关闭的,可以在application.properties中开启

feign.hystrix.enabled=true

    (2)在service层的接口中添加熔断回调方法(在上面的代码的基础上,在@FeignClient 中添加熔断回调如下,如果出现熔断,则执行接口的实现类中的方法)

@FeignClient(value = "spring-cloud-provider",fallback = MyServiceImpl.class)//如果下面的方法执行失败,会熔断并去执行MyServiceImpl中的方法

    (3)创建接口实现类,例如

@Component
public class MyServiceImpl implements MyService {

    @Override
    public String getPort() {
        return String.format("获取失败");
    }
}

  3熔断监控

    如果需要监控熔断信息,可以做如下步骤

    (1)导入相关依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

    (2)在主类中添加注解 @EnableHystrixDashboard 开启熔断监控,启动项目,并访问/hystrix,页面如下

    

    (3)添加配置类

@Configuration
public class MyConfig {
    @Bean
    public ServletRegistrationBean getServlet(){
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/myhystrix");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
    }
}

    (4)在页面中输入路径即(ip+端口号+配置类中的addUrlMappings)可查看熔断信息,例如下图

    

猜你喜欢

转载自www.cnblogs.com/ywb-articles/p/11073603.html