认识微服务及SpringCloud的使用及配置

认识微服务:

  • 概念:微服务是系统架构的一种设计风格,将一个原本独立的服务拆分成多个小型服务,每个服务独立运行在在各自的进程中,服务之间通过 HTTP RESTful API 进行通信.每个小型的服务都围绕着系统中的某个耦合度较高的业务进行构建。微服务是一种经过良好设计的分布式架构方案,而全球的互联网公司都在积极尝试自己的微服务落地方案。其中在java领域最引人注目的是SpringCloud提供的方案。

  • 架构图:认识微服务及SpringCloud的使用及配置_第1张图片

  • 微服务架构特征
    3.1单一职责:微服务拆分粒度更小,每个服务都应对唯一的业务能力,做到单一职责
    3.2自治:团队独立、技术独立、数据独立,独立部署和交付
    3.3面向服务:服务提供统一标准的接口,与语言无关、与技术无关
    3.4隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

SpringCloud

  • SpringCloud是目前国内使用最广泛的微服务技术栈。官网地址:https://spring.io/projects/spring-cloud。

  • SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验:

  • SpringCloud与SpringBoot的版本兼容关系,可以去看GitHub源码里面有介绍;

总结:
  • 单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统

  • 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝

  • 微服务:一种良好的分布式架构方案

  • 优点:拆分粒度更小、服务更独立、耦合度更低

  • 缺点:架构非常复杂,运维、监控、部署难度提高

  • SpringCloud:SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件

SpringCloud:注册中心-Eureka的使用(已闭源)

Eureka的作用:

认识微服务及SpringCloud的使用及配置_第2张图片
按照上面调用流程,消费者调用服务者存在很多问题:
1:服务消费者该如何获取服务提供者的地址信息?
2:如果有多个服务提供者,消费者该如何选择?
3:消费者如何得知服务提供者的健康状态?

Eureka注册中心如何解决上面的问题?
认识微服务及SpringCloud的使用及配置_第3张图片

Eureka工作原理:

#1:消费者该如何获取服务提供者具体信息?
服务提供者启动时向eureka注册自己的信息
eureka保存这些信息
消费者根据服务名称向eureka拉取提供者信息

#2:如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中挑选一个

#3:消费者如何感知服务提供者健康状态?
服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
eureka会更新记录服务列表信息,心跳不正常会被剔除
消费者就可以拉取到最新的信息

搭建EurekaServer

  1. 引入spring-cloud-starter-netflix-eureka-server的依赖:
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
  1. 在启动类上加注解:
@EnableEurekaServer:开启EurekaServer功能
  1. 配置核心配置文件application.yml:
server:
  port: 8001    #端口号
spring:
  application:
    name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
eureka:
  client:
    register-with-eureka: false   #是否将自己注册到Eureka中
    fetch-registry: false   #是否从eureka中获取服务信息
    service-url:
      defaultZone: http://localhost:8001/eureka

注册生产者到Eureka中心:

  1. 引入spring-cloud-starter-netflix-eureka-client的依赖到生产者:

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
  1. 往application.yml配置文件添加对应配置:
spring:
  application:
    name: user  #该name会被用到服务中心
eureka:
  client:
    service-url:
      # EurekaServer的地址
      defaultZone: http://localhost:8001/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${server.port}:@project.version@
    lease-renewal-interval-in-seconds: 30 #心跳周期,默认是30秒
    lease-expiration-duration-in-seconds: 90 #心跳失败最长超时间,默认90秒
    ip-address: localhost #ip地址

效果:
认识微服务及SpringCloud的使用及配置_第4张图片

注册消费者到Eureka中心:

  1. 引入spring-cloud-starter-netflix-eureka-client的依赖到生产者:

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
  1. 往application.yml配置文件添加对应配置:
spring:
  application:
    name: order  #该name会被用到服务中心
eureka:
  client:
    service-url:
      # EurekaServer的地址
      defaultZone: http://localhost:8001/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${server.port}:@project.version@
    lease-renewal-interval-in-seconds: 30 #心跳周期,默认是30秒
    lease-expiration-duration-in-seconds: 90 #心跳失败最长超时间,默认90秒
    ip-address: localhost #ip地址

效果和生产者一样。
消费者也可以是生产者,生产者也可以是消费者

远程调用(代码实现使用)

之前消费者调用生产者URL路径:

//地址固定、单一
String url = "http://localhost:18081/user/" + orderInfo.getUserName();

现在消费者调用生产者URL路径:

//第一个user是服务中心的user地址及
//配置文件里的spring.application:.name: order
String url = "http://user/user/" + orderInfo.getUserName();

注意:需要开启负载均衡
RestTemplate方法实现可以使用注解:@LoadBalanced //开启负载均衡
或者开启全局负载均衡

你可能感兴趣的:(Java问题及优化方案,微服务,微服务,spring,cloud,java)