Spring_Cloud入门笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/klli15/article/details/93757828

Spring Cloud 入门笔记

在微服务架构中,需要几个基础的服务治理组件:服务注册与发现(Eureka-server)、服务消费(Eureka-Client)、负载均衡(Ribbon)、断路器(Hystrix)、智能路由(Zuul)、配置管理(config-server)

  • Eureka-server

    • 一个服务注册中心,服务都需要注册到它的容器里。它维护一个类似于路由表的表,服务注册后会将其名字以及访问地址记录在这张表中,所有注册在这个服务中心里的服务可以根据 服务名字 来访问服务。

    • 创建步骤

      • 要在启动程序加入 @EnableEurekaServer 注解
      • 要在application.yml 中配置
      server:
        port: 8761
      eureka:
        instance:
          hostname: localhost
        client:
          registerWithEureka: false // 这两项说明这是一个server
          fetchRegistry: false
          serviceUrl:  //因为默认情况下,eureka server也是一个client,所以也需要指定url
            defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      
  • Eureka-Client

    • 一个处理外界请求的客户端,相当于Controller

    • 创建步骤

      • 要在启动程序加入 @EnableEurekaClient 注解
      • 要在application.yml 中配置
      eureka:
        client:
          serviceUrl: //注册中心的地址
            defaultZone:{eureka-server-url}
      server:
        port: 8762  //暴露给外界的端口
      spring:
        application:
          name: {service-name}  //这个必须指定,因为服务与服务之间的相互调用(RPC)都是根据这个name
      
  • 小结

    • 启动要加入相应的注解,以便标识这是一个client还是server
    • server的配置文件关键要配置eureka.instance.registerWithEureka: false 以及 eureka.instance.fetchRegistery: false
    • client 的配置文件关键要配置 port application.name 以及 eureka-server.url
  • ribbon

    • ribboneureka-client 的一种,它具有负载均衡的能力。
    • 启动程序中要有@EnableDiscoveryClient 向服务中心注册,并向ioc容器注入一个bean:restTemplate 并通过 @LoadBalanced 注解标明开启负载均衡功能
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ServiceRibbonApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(ServiceRibbonApplication.class, args);
    	}
    
    	@Bean
    	@LoadBalanced
    	RestTemplate restTemplate() {
    		return new RestTemplate();
    	}
    
    }
    
    • Service类要自动装配刚才注入的 Bean ,并提供访问url
    @Service
    public class HelloService {
    
        @Autowired
        RestTemplate restTemplate;
    	//ribbon 使用 熔断器可加下面这句
    	// @HystrixCommand(fallbackMethod = "hiError")
        public String hiService(String name) {
        // ribbon 会根据 SERVICE-HI 来选择具体的服务示例
        // 为什么还要另外一个Service?可以当作两个服务,一个是负载均衡服务(对外--service),另外一个是实际的服务(对内-- Mapper),而Spring Cloud服务之间是以RPC的形式调用的
            return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
        }
        
        public String hiError(){...}
    }
    
    • Controller 类则直接调用 service 类就好
  • Feign

    • Feign 已经融合了 Ribbon+RestTemplate ,即本身就有负载均衡的功能,它还有熔断器的功能。它主要用来发起服务之间的请求的。
    • 配置文件与配置Clien 一样
    • 启动类要再加上@EnableFeignClient 注解
    • 通过 interface 接口与 服务Client 对接,如
    @FeignClient(value = "service-hi")
    public interface SchedualServiceHi {
        @RequestMapping(value = "/hi",method = RequestMethod.GET)
        String sayHiFromClientOne(@RequestParam(value = "name") String name);
    }
    
  • 熔断器Hystrix

    • 当一个服务client因为意外挂掉了,调用它的服务就会一直等待它的响应而导致线程资源被消耗,所以需要有熔断器以防止服务器资源被耗尽,就好像Web项目错误时要指定错误页一样
    • 依赖要加上:
    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    <dependency>
                <groupId>com.netflix.hystrix</groupId>
                <artifactId>hystrix-javanica</artifactId>
                <version>RELEASE</version>
    </dependency>
    
    • ribbon启动类要加上@EnableHystrix注解开启Hystrix ,而 feign 则需要在yml文件中配置 feign.hystrix.enabled: true
    • Service 接口指定 fallback 指定类即可
    @FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class)
    public interface SchedualServiceHi {
        @RequestMapping(value = "/hi",method = RequestMethod.GET)
        String sayHiFromClientOne(@RequestParam(value = "name") String name);
    }
    
    // 注册到ioc容器,才能找到
    @Component
    public class SchedualServiceHiHystric implements SchedualServiceHi {
        @Override
        public String sayHiFromClientOne(String name) {
            return "sorry "+name;
        }
    }
    
  • 小结

    • @Resitory @Component @Controller @Service 的区别

      注解 含义 备注
      @Component 最普通的组件,可以被注入到spring容器进行管理 以下三个注解都是属于 @Component 的一种
      @Repository 作用于持久层 会给方法自动的加上一个后置处理器,万一出现错误则转变成Spring 统一的Exception
      @Service 作用于业务逻辑层 用于标明这个是一个业务逻辑层,其他与@Component 没有区别
      @Controller 作用于表现层(spring-mvc的注解)
  • Zuul 路由

    • 路由的作用是统一管理各种服务,根据路由表转发请求给其他服务,对外暴露统一的服务url,调用者(如前端)无需知道服务具体的url只需要调用统一的接口url 即可,如/api/

    • zuul 路由还有过滤器的作用,可以在路由期间进行一系列动作

      时刻 filterType
      路由之前 pre
      路由之时 routing
      路由之后 post
      发送错误调用 Error
    • 设置过滤器需要继承 ZuulFilter 抽象父类,并实现以下方法

      方法 含义 取值
      filterType 触发后,在什么时候过滤(执行) 如上表
      filterOrder 执行的优先度 Interger
      shouldFilter 什么情况下会触发这个过滤器 方法,可用判断来识别,返回true则过滤
      run 过滤器的具体动作,即执行内容 方法,如判断要不要转发,写入日志等动作
  • 配置中心

    • 由于配置文件在Spring Cloud 中起到非常重要的作用,所以可以将其作为一个服务来部署在服务器上,以便我们可以进行维护,但是如果想实现热更新,则需要安装rabbitmq 插件。

    • config-server

      • 作为一个git仓库的取用者,供调用者使用。一个config-server只能从一个数据源取配置文件,因此,如需从不同的源取得不同的配置文件,则需要配置相对应的config-server
      • 其配置文件模板如下:
      spring.application.name=config-server
      server.port=8888
      spring.cloud.config.server.git.uri=https://github.com/forezp/SpringcloudConfig/
      spring.cloud.config.server.git.searchPaths={directory} // 从哪个文件夹取,无则不填,无需加 
      #注册到eureka 中,以便各种服务能够知道相应的配置中心地址
      eureka.client.serviceUrl.defaultZone=http://localhost:8889/eureka/
      spring.cloud.config.label=master  // 从哪个分支
      spring.cloud.config.server.git.username= //如为私有库,则写
      spring.cloud.config.server.git.password=
      
    • config-client

      • 角色是需要获取 配置文件的微服务

      • ~~~角色是暴露给外界的url,因为外界都通过这个来获得配置文件(?) ~~~

      • 可以在配置文件中指明自己需要的文件

        #以下指定
        spring.application.name=config-client
        spring.cloud.config.label=master
        spring.cloud.config.profile=dev
        
        eureka.client.serviceUrl.defaultZone=http://localhost:8889/eureka/
        spring.cloud.config.discovery.enabled=true  #从配置中心读取文件
        spring.cloud.config.discovery.serviceId=config-server  //根据serviceId取得IP地址,由于根据id,所以可以实现负载均衡
        server.port=8881
        
      • config-client会在Springboot初始化时请求以下配置文件,如发现则使用该配置文件进行配置,如果与本地配置文件有重复,则以 线上配置文件 为准。

        1. /{application}/{profile}[/{label}]
        2. /{application}-{profile}.yml
        3. /{label}/{application}-{profile}.yml
        4. /{application}-{profile}.properties
        
    • pom.xml中依赖了spring-boot-starter-config 时,它会默认从 8888 端口获取引导程序而忽略本地的 application.yml,如需改变这个端口,可以在 bootstrap.yml 中定义端口,并设置spring.cloud.config.enabled: false(默认为 true) ;或者在这个文件中定义 eureka 注册中心的地址,并说明自己需要的配置文件。

    • 关于配置文件的热更新,要在config-client 的配置文件加上 management.endpoints.web.exposure.include= bus-refresh 并且,访问的是 /actuator/bus-refresh, 使用的是 POST 请求。

  • 知识点:bootstrap.ymlapplication.yml 的区别

    • bootstrap 会优先与 application 加载

    • spring cloud文档说明

    • 我的理解;

      bootstrap.yml 主要区别于 application.yml 的地方是,前者可以在初始化之前去请求外部配置资源来 引导 主程序。同时如果不需要引导程序(如从网络请求配置文件),则可以使用 spring.cloud.bootstrap.enabled=false

END

猜你喜欢

转载自blog.csdn.net/klli15/article/details/93757828
今日推荐