分布式微服务治理

目录

微服务

1、微服务设计原则

2、微服务四个核心问题:

3、微服务的优缺点?

4、解决微服务的方案

5、微服务通信方式

1、RPC通信介绍

2、HTTP通信介绍

SpringCloud

1、Eureka注册中心

1,启动器依赖

2,配置文件

3,服务注册与发现

4,Eureka高可用

5,Eureka失效剔除以及自我保护

2、Ribbon负载均衡

3、hystrix服务熔断

4,Feign伪装请求

Dubbo学习

Dubbo概述

Dubbo配置步骤

Zookeeper服务注册

Dubbo配置说明


  1. 微服务------一种软开技术,面向服务SOA架构的一种变体,把程序构造为很多松耦合的服务。
  2. 分布式------一种部署方式,提高系统稳定性,优化性能。
    分散部署在不同的机器。是一种面向SOA架构的,服务之间也是通过RPC等方式交互的。逻辑架构设计完后就该做物理架构设计,系统应用部署在超过一台服务器或虚拟机上,且各分开部署的部分彼此通过各种通讯协议交互信息,就可算作分布式部署,生产环境下的微服务肯定是分布式部署的,分布式部署的应用不一定是微服务架构的,比如集群部署,它是把相同应用复制到不同服务器上,但是逻辑功能上还是单体应用。

微服务

1、微服务设计原则

  • 单一职责----每个微服务只需实现自己的业务逻辑;
  • 服务自治----每个微服务从开发、测试、运维、存储等均独立,不依赖于其它模块;
  • 轻量级通信----通信的语言轻量,通信方式需跨语言、跨平台的;
  • 接口明确----接口尽量做的更通用,更灵活,从而尽量避免其它模块连带调整。

2、微服务四个核心问题:

  • 这么多服务,客户端如何访问
  • 这么多服务,服务间如何通信
  • 这么多服务,如何实现和治理
  • 这么多服务,服务挂了怎么办

3、微服务的优缺点?

  • 单一职责,聚焦指定业务功能,开发效率高;
  • 松耦合,各阶段独立、存储可以独立也可以统一;
  • 易于与第三方平台集成,自动部署(jenkins、Hudson、bamboo...);
  • 开发人员要处理分布式系统的复杂性、运维测试成本增大;
  • 服务器通信成本,部署依赖问题,内存开销大;

4、解决微服务的方案

  • XVCZXCVBNM,./
  • SpringCloud Alibaba-一站式解决

5、微服务通信方式

1、RPC通信介绍

       RPC(Remote Procedure Call Protocol)远程过程调用,要从一台计算机上执行另外一台计算机上的程序。跨越了物理服务器的限制,在网络中完成。基于Socket,工作在会话层。自定义数据格式,速度快,效率高。

  • 两个重点:能否快速建立连接、序列化和反序列化机制快不快;
  • 框架很多:Dubbo、HSF、早期的webservice、谷歌开源的gRPC、Apache的Thrift、新浪微博的Montan等;

RPC调用过程

  • **序列化:**把对象转换为字节序列的过程称为对象的序列化,编码过程。
  • **反序列化:**把字节序列恢复为对象的过程称为对象的反序列化,也解码过程。

2、HTTP通信介绍

http其实是一种网络传输协议,基于TCP,工作在应用层,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议,也可以用来进行远程服务调用。缺点是消息封装臃肿,优势是对服务的提供和调用方没有任何技术限定,自由灵活,更符合微服务理念。开源http客户端工具,例如:HttpClient(Apache)-OKHttp(android轻量网络通信框架,移动支付Square公司贡献(还提供Picasso图片缓存框架),okhttp用于替代HttpUrlConnection和Apache HttpClient)-URLConnection(URLConnection任何网络连接都需要经过socket才能连接,HttpURLConnection不需要设置socket,所以,HttpURLConnection并不是底层的连接,而是在底层连接上的一个请求。这就是为什么HttpURLConneciton只是一个抽象类,自身不能被实例化的原因。)

Spring提供了一种简单便捷的模板---RestTemplate。底层是HttpURLConnection实现!使用restTemplate访问restful接口非常的简单粗暴无脑。(url、requestMap、ResponseBean.class)这三个参数分别代表 请求地址、请求参数、HTTP响应转换被转换成的对象类型。RestTemplate方法的名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指示返回的内容。本例中调用了restTemplate.postForObject方法,post指调用了HTTP的post方法,Object指将HTTP响应转换为您选择的对象类型。

小结:

1.调用的各种实现所谓的http连接的api(包括java自带的httpurlconnection)其底层基本上都是调用的jdk的socket接口。
2.socket是基于tcp/ip协议封装的一套实现tcp连接的接口,或者说是工具。
3.所以会说其实http也是通过socket来实现的这种看似没有问题但又含糊不清的说法。
4.http只是一种协议,什么请求头,请求题,响应头都是根据固定的格式制定的报文,然后最终(可能不直接调用volley,okhttp等)都会通过socket接口将这些报文发给服务器或者客户端。

SpringCloud

SpringCloud是个生态,并不是一门技术。六大模块:负载均衡、服务注册与发现、监控、配置管理、网关、分布式追踪;

1、Eureka注册中心

首先我们来解决第一问题,服务的管理。犹瑞卡,注册中心来自NetFlix。
Eureka负责管理、记录服务提供者的信息。服务调像下单一样吧需求告诉Eureka,Eureka就会告诉所需服务。同时,服务提供方与Eureka之间通过 “心跳” 机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。这就实现了服务的自动注册、发现、状态监控。

  • Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
  • 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
  • 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
  • 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态

1,启动器依赖

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

2,配置文件

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      # eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址
      defaultZone: http://127.0.0.1:10086/eureka
    # 不注册自己,集群的话就注册
    register-with-eureka: false
    # 不拉取服务
    fetch-registry: false

3,服务注册与发现

  • 服务注册:在服务提供工程user-service上添加Eureka客户端依赖;自动将服务注册到EurekaServer服务地址列表。
    Provider启动时,会检测配置属性中的: eureka.client.register-with-erueka=true 参数是否正确,默认true。会向EurekaServer发起一个Rest请求,并携带自己的元数据信息,EurekaServer会把这些信息保存到一个双层Map结构中。
    第一层Map的Key---服务id,一般是配置中的 spring.application.name 属性
    第二层Map的key---服务实例id。一般host+ serviceId + port,例如: localhost:user-service:8081
    值则是服务的实例对象,也就是说一个服务,可以同时启动多个不同实例,形成集群。
  • 服务发现:在服务消费工程consumer-demo上添加Eureka客户端依赖;可以使用工具类根据服务名称获取对应的服务地址列表。
  1. 添加Eureka客户端依赖
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
  2. 添加启动引导类注解
    启动类加入@EnableDiscoveryClient 注解
  3. 修改配置
spring:
  application:
    name: consumer-demo(两个服务的名字)
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka(Eureka中心地址)

4,Eureka高可用

eureka-server

eureka:
  server:
    # 服务失效剔除时间间隔,默认60秒
    eviction-interval-timer-in-ms: 60000
    # 关闭自我保护模式(默认是打开的)
    enable-self-preservation: false

user-service 

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    # 更倾向使用ip地址,而不是host名
    prefer-ip-address: true
    # ip地址
    ip-address: 127.0.0.1
    # 续约间隔,默认30秒
    lease-renewal-interval-in-seconds: 5
    # 服务失效时间,默认90秒
    lease-expiration-duration-in-seconds: 5

consumer-demo 


                
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Thompson

相互学习,欢迎指正。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值