微服务学习笔记1

springcloud初体验

一、服务注册与发现总结

1.组件的使用方式

1.1 注册中心
(1)Eureka

  • 搭建注册中心
    引入依赖 spring-cloud-starter-netflix-eureka-server

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

    配置 EurekaServer

    eureka:
    instance:
     hostname: localhost
    client:
     registerWithEureka: false 
     fetchRegistry: false
     serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    

    通过 @EnableEurekaServer 激活Eureka Server端配置

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
    public static void main(String[] args) {
    SpringApplication.run(EurekaServerApplication.class, args);
    }
    }
    
  • 服务注册
    服务提供者引入 spring -cloud-starter-netflix-eureka-client 依赖

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

    通过 eureka.client.serviceUrl.defaultZone 配置注册中心地址

    eureka:
    client:
     serviceUrl: # eureka server的路径
      defaultZone: http://localhost:8761/eureka/
    instance:
     prefer-ip-address: true #使用ip注册
    
    @SpringBootApplication
    //@EnableDiscoveryClient
    //@EnableEurekaClient
    public class UserApplication {
    public static void main(String[] args) {
    SpringApplication.run(UserApplication.class, args);
    }
    }
    

(2)consul

  • 简介

    Consul 使用 Go 语言编写,使用 Raft 算法来保证一致性,支持健康检查,支持 http 和 dns 协议接口。

  • 搭建注册中心
    下载安装 consul
    启动 consul consul agent -dev

  • 服务注册
    服务提供者引入 spring -cloud-starter-consul-discovery 依赖

    <!--SpringCloud提供的基于Consul的服务发现-->
    <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
    <!--actuator用于心跳检查-->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    

    通过 spring.cloud.consul.hostspring.cloud.consul.port 指定Consul Server的请
    求地址

    spring:
    ...省略
    cloud:
     consul: #consul相关配置
      host: 192.168.74.101 #ConsulServer请求地址
      port: 8500 #ConsulServer端口
      discovery:
        #是否注册
       register: true
        #实例ID
       instance-id: ${spring.application.name}-1
        #服务实例名称
       service-name: ${spring.application.name}
        #服务实例端口
       port: ${server.port}
        #健康检查路径
       healthCheckPath: /actuator/health
        #健康检查时间间隔
       healthCheckInterval: 15s
        #开启ip地址注册
       prefer-ip-address: true
        #实例的请求ip
       ip-address: ${spring.cloud.client.ip-address}
    

(3)consul与Eureka的区别

  • 一致性
    Consul强一致性(CP)
    服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认
    为注册成功
    Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。
    Eureka保证高可用和最终一致性(AP)
    服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否
    replicate成功
    当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提
    供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺
    牲了一致性。
  • 开发语言和使用
    eureka就是个servlet程序,跑在servlet容器中
    Consul则是go编写而成,安装启动即可

2.服务调用

(1)Ribbon

  • 简介

    Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读
    取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。

    在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的
    列表信息,并基于内置的负载均衡算法,请求服务

  • 作用

    (1)服务调用

    ​ 基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求

    路径的)映射关系。借助
    RestTemplate 最终进行调用

    (2)负载均衡

    当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

  • 通过 Ribbon结合RestTemplate方式进行服务调用只需要在声明RestTemplate的方法上添加注解
    @LoadBalanced即可

    /**
    	 * 使用spring提供的RestTemplate发送http请求到商品服务
    	 *      1.创建RestTemplate对象交给容器管理
    	 *      2.在使用的时候,调用其方法完成操作 (getXX,postxxx)
    	 * * @LoadBalanced : 是ribbon提供的负载均衡的注解
    	 */
    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate() {
      return new RestTemplate();
    }
    
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/buy/{id}")
    public Product order() {
    //通过restTemplate调用商品微服务
    //Product product =
    restTemplate.getForObject("http://127.0.0.1:9002/product/1", Product.class);
    Product product = restTemplate.getForObject("http://shop-service-
    product/product/1", Product.class);
    return product;
    }
    
  • 可以通过 { 服务名称}.ribbon.NFLoadBalancerRuleClassName 配置负载均衡策略

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubrEFimq-1602131739964)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1601978081713.png)]

    #修改ribbon的负载均衡策略   服务名 -  ribbon - NFLoadBalancerRuleClassName : 策略
    service-product:
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置负载均衡策略
        ConnectTimeout: 250 # Ribbon的连接超时时间
        ReadTimeout: 1000 # Ribbon的数据读取超时时间
        OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
        MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
        MaxAutoRetries: 1 # 对当前实例的重试次数
    

(2)Feign

  • 简介

    Feign是Netflix开发的声明式模板化的HTTP客户端,其灵感来自Retrofit,JAXRS-2.0以及WebSocket.
    Feign可帮助我们更加便捷,优雅的调用HTTP API
    在SpringCloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完
    成了。
    Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
    SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka
    从而让Feign的使用更加方便。

  • 服务消费者引入 spring-cloud-starter-openfeign 依赖

    		<!--springcloud整合的openFeign-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
    
  • 通过 @FeignClient 声明一个调用远程微服务接口

    **
     * 声明需要调用的微服务名称
     *  @FeignClient
     *      * name : 服务提供者的名称
     */
    @FeignClient(name="service-product")
    public interface ProductFeignClient {
    
    	/**
    	 * 配置需要调用的微服务接口
    	 */
    	@RequestMapping(value="/product/{id}",method = RequestMethod.GET)
    	public Product findById(@PathVariable("id") Long id);
    }
    
  • 添加ProductFeginClient的自动注入,并在order方法中使用ProductFeginClient 完成微服务调用

    @RestController
    @RequestMapping("/order")
    public class OrderController {
    @Autowired
    private ProductFeginClient productFeginClient;
    @GetMapping("/buy/{id}")
    public Product order(@PathVariable  Long id) {
    	return productFeginClient.findById(id);
    }
    }
    
  • 启动类上通过 @EnableFeignClients 激活Feign

    @EnableFeignClients
    public class OrderApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(OrderApplication.class,args);
    	}
    }
    
  • Feign支持如下配置项

    feign:
     client:
     	config:
      		feignName: ##定义FeginClient的名称 需要调用的服务名称
       		connectTimeout: 5000  # 相当于Request.Options
       		readTimeout: 5000   # 相当于Request.Options
       		 # 配置Feign的日志级别,相当于代码配置方式中的Logger
       		 #配置feign日志的输出
    		# 日志配置  NONE : 不输出日志(高)   BASIC: 适用于生产环境追踪问题
    		# HEADERS : 在BASIC的基础上,记录请求和响应头信息   FULL : 记录所有
       		loggerLevel: full
       		 # Feign的错误解码器,相当于代码配置方式中的ErrorDecoder
       		errorDecoder: com.example.SimpleErrorDecoder
       		 # 配置重试,相当于代码配置方式中的Retryer
       		retryer: com.example.SimpleRetryer
       		 # 配置拦截器,相当于代码配置方式中的RequestInterceptor
       		requestInterceptors:
        		- com.example.FooRequestInterceptor
        		- com.example.BarRequestInterceptor
       		decode404: false
    
  • Spring Cloud Feign 支持对请求和响应进行GZIP压缩

    feign:
    	compression:
    		 request:
     		 	enabled: true # 开启请求压缩
      			mime-types: text/html,application/xml,application/json # 设置压缩的数据类型 ,非必须
      			min-request-size: 2048 # 设置触发压缩的大小下限,非必须
    		 response:
      			enabled: true # 开启响应压缩
    
    
  • 开启日志级别

    logging:
    	level:
     	  cn.itcast.order.fegin.ProductFeginClient: debug   #feign微服务调用接口的类路径
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值