SpringCloud微服务实战学习笔记

SpringCloud 简介

Spring Cloud 是一个基于Spring Boot 实现的微服务架构开发工具.它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作的提供了一种简单的开发方式.(百度的基础概念)

Spring Colud包含的子项目

Spring Cloud Config 配置管理工具,支持使用git存储配置内容.
Spring Cloud Netflix:核心组件:
Eureka:服务治理组件,包含服务注册中心,服务注册发现
Hystrix:容错管理组件.断路器等
Ribbon:客户端负载均衡的服务调用组件.
Feign:基于Ribbonhe Hystrix的声明是服务调用组件
Zuul:网关组件,提供智能路由、访问过滤等.

spring boot 项目

src/main/resources 目录是spring boot 的配置目录.支持格式properties、YAML(无法通过@PropertySource注接加载配置,可以使用@ConfigurationProperties注解)
spring boot 可以根据不用环境配置多个配置文件,通过启动时加载不同配置.
基础配置:

# 默认启动端口信息
server:
  port: 8080
spring:
  # 配置默认启动的环境配置
  profiles:
    active: dev
  # 服务名称
  application:
    name: demo-server
# dev de 环境配置文件
spring:
  profiles: dev
server:
  port: 3000

监控管理,actuator

pom文件中加入依赖:
     
        org.springframework.boot
        spring-boot-starter-actuator
    
 即可实现基础的监控管理,会根据依赖自动创建基础的监控和管理端点
     eg:/health

也可以自定重写或者配置定义监控端点,yaml配置如下

# 默认启动端口信息
server:
  port: 8080
spring:
  # 配置默认启动的环境配置
  profiles:
    active: dev
  # 服务名称
  application:
    name: demo-server
# 配置监控端点
management:
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: health,shutdown,mappings,info,beans,metrics,threaddump

SpringCloud Eureka注册中心

通过在普通的springboot项目的启动类添加@EnableEurekaServer,可以开启服务注册中心.

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
     

    public static void main(String[] args) {
     
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

注:默认配置下,注册中心也会将自己作为客户端注册自己,所以需要手动禁止注册行为,可以在配置文件中添加注解register-with-eureka: false,fetch-registry: false.如果搭建高可用服务注册中心(多个注册中心互相注册,同步信息),则需要配置默认注册地址.

server:
  port: 1111
eureka:
  server:
    #关闭自我保护(本地调试时使用,正式生产环境最好打开)
    enable-self-preservation: false
    #清理间隔,默认60s
    eviction-interval-timer-in-ms: 10000
  instance:
    ip-address: 127.0.0.1
    #标识注册中心的hostname
    hostname: peer1
    prefer-ip-address: true
  client:
    #true 会默认向注册中心注册服务,false 则禁止这种行为
    register-with-eureka: false
    #fasle 不检索其他服务,
    fetch-registry: false
    service-url:
      #另一个注册中心地址
      defaultZone: http://127.0.0.1:1112/eureka/

通过访问http://127.0.0.1:1111 或者 http://127.0.0.1:1112 可以进入eureka可以界面,查看是否配置成功,现有注册的服务.

服务提供者

普通的springboot项目添加@EnableDiscoveryClient,实现eureka客户端,通过配置文件实现注册中心的注册.

# 默认启动端口信息
server:
  port: 8080
spring:
  # 配置默认启动的环境配置
  profiles:
    active: dev
  # 服务名称
  application:
    name: demo-server
# 配置监控端点
management:
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: health,shutdown,mappings,info,beans,metrics,threaddump
eureka:
  instance:
      prefer-ip-address: true
      #服务续约的心跳时间,默认30s
      lease-renewal-interval-in-seconds: 10
      #服务续约的失效时间
      lease-expiration-duration-in-seconds: 20
      #标识注册中心的hostname
#      hostname: ${spring.application.name}:${server.port}
#      ip-address: 127.0.0.1
#      instance-id: ${eureka.instance.prefer-ip}:${spring.application.name}:${server.port}
  client:
    #    #true 会默认向注册中心注册服务,false 则禁止这种行为
    register-with-eureka: true
    #    #fasle 不检索其他服务,
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:1111/eureka/,http://127.0.0.1:1112/eureka/

服务消费者

服务消费者也需要进行eureka的注册,配置和服务者雷同

Ribbon实现客户端负载均衡

ribbon实现负载均衡需要在启动类里加载RestTemplate的bean实例.使用@LoadBalanced注解开始负载均衡

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
     
        return new RestTemplate();
    }

ribbon会在客户端维护一份服务清单,默认更新时间为30s可以根据需求配置,registry-fetch-interval-seconds: 30

server:
  port: 4000
spring:
  application:
    name: ribbon-consumer
eureka:
  client:
    #    #true 会默认向注册中心注册服务,false 则禁止这种行为
    register-with-eureka: true
    #    #fasle 不检索其他服务,
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:1111/eureka/,http://127.0.0.1:1112/eureka/
      #服务消费者,缓存清单更新时间,默认30s
    registry-fetch-interval-seconds: 30
  instance:
    prefer-ip-address: true
    #服务续约的心跳时间,默认30s
    lease-renewal-interval-in-seconds: 10
    #服务续约的失效时间
    lease-expiration-duration-in-seconds: 20
    #标识注册中心的hostname
#    hostname: hostname
    #      ip-address: 127.0.0.1
#    instance-id: ${spring.application.name}:${server.port}

RestTemplate详解

get请求

RestTempplate.getForEntity(String url, Class responseType, Object… uriVariables)

        RestTemplate restTemplate=new RestTemplate();
        String name="David";
        ResponseEntity<User> responseEntity=restTemplate.getForEntity("http://demo-server/hello?name={1}",User.class,name);
        User user=responseEntity.getBody();

ResponseEntity对象是spring对HTTO请求响应的封装,存储HttpStatus(404,500),它的父类还有httpHeaders.上述例子最后一个参数将会替换{1} 的占位符.

注:uriVariables是数组,所以url中占位符的顺序必须一致.

RestTempplate.getForEntity(String url, Class responseType, Map uriVariables)

        RestTemplate restTemplate=new RestTemplate();
        Map<String,String> newMap=new HashMap<>(16);
        String name="David";
        newMap.put("name",name);
        ResponseEntity<User> responseEntity=restTemplate.getForEntity("http://demo-server/hello?name={name}",User.class,newMap);
        User user=responseEntity.getBody();

RestTempplate.getForEntity(URI url,Class responseType),该方法使用URI对象代替之前的url和urlVariables参数执行访问地址和参数绑定

RestTemplate restTemplate=new RestTemplate();
        UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://demo-server/hello?name={name}").build()
                .expand("David").encode();
        URI uri=uriComponents.toUri();
        ResponseEntity<User> responseEntity=restTemplate.getForEntity(uri,User.class);
        User user=responseEntity.getBody();

RestTempplate.getForObject(URI url, Class responseType),是对getForEntity的进一步封装

RestTemplate restTemplate=new RestTemplate();
        UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://demo-server/hello?name={name}").build()
                .expand("David").encode();
        URI uri=uriComponents.toUri();
        User user=restTemplate.getForObject(uri,User.class);
post请求

restTemplate中对post请求第一种:postForEntity函数和get请求中的getForEntity类似
第二种:postForObject方法和getForObject方法类似
第三种:postForLocation函数,一般登录或者注册需要重定向的时候使用

        RestTemplate restTemplate=new RestTemplate();
        User user=new User();
        user.name="David";
        URI uri=restTemplate.postForLocation("http://demo-server/hello",user);
put请求(Object request, Object… uriVariable一起用不太懂)

put(String url, @Nullable Object request, Object… uriVariables)
put(String url, @Nullable Object request, Map uriVariables)
put(URI url, @Nullable Object request)

RestTemplate restTemplate=new RestTemplate();
        User user=new User();
        user.name="David";
        Long id=1000L;
        restTemplate.put("http://demo-server/hello/{1}",user,id);

你可能感兴趣的:(SpringCloud微服务实战学习笔记)