基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程

微服务中心Eureka介绍与架构

Eureka就是一个专门用于服务发现的服务器,一些服务注册到该服务器,而另一些服务通过该服务器查找其所要调用执行的服。Eureka就好比是滴滴打车,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。
同时,服务提供方与Eureka之间通过“心跳” 机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。
这就实现了服务的自动注册、发现、状态监控。

工作原理图

基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第1张图片

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

工作原理图解析

基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第2张图片

一、创建一个空的父工程

微服务中需要同时创建多个项目,为了方便演示,先创建一个父工程,后续的工程都以这个工程为父,使用Maven的聚合和继承。统一管理子工程的版本和配置。
基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第3张图片
pom.xml文件:


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <groupId>com.hsxgroupId>
    <artifactId>springcloud-testartifactId>
    <packaging>pompackaging>
    <version>1.0-SNAPSHOTversion>
    <modules>
        <module>eureka-servermodule>
        <module>billmanagertk-servicemodule>
        <module>gateway-servermodule>
        <module>config-servermodule>
        <module>billmanagertk-webmodule>
    modules>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.5.RELEASEversion>
        <relativePath/>
    parent>

    <properties>
        <java.version>1.8java.version>
        <spring-cloud.version>Greenwich.SR1spring-cloud.version>
        <mapper.starter.version>2.1.5mapper.starter.version>
        <mysql.version>5.1.46mysql.version>
    properties>

    <dependencyManagement>
        <dependencies>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            
            <dependency>
                <groupId>tk.mybatisgroupId>
                <artifactId>mapper-spring-boot-starterartifactId>
                <version>${mapper.starter.version}version>
            dependency>
            
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>${mysql.version}version>
            dependency>
        dependencies>
    dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

注意:spring clound和spring boot 的版本对应 greenwich版本clound对应spring boot
2.1.x 注意:注意聚合父工程pom

这里已经对大部分要用到的依赖的版本进行了 管理,方便后续使用

二、创建微服务Eureka注册中心

Eureka是服务注册中心,只做服务注册;自身并不提供服务也不消费服务。可以搭建Web工程使用Eureka,可以使用Spring Boot方式搭建。

  1. pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-testartifactId>
        <groupId>com.hsxgroupId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>eureka-serverartifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
        dependency>
    dependencies>

project>
  1. 编写启动类:
@SpringBootApplication
@EnableEurekaServer //声明当前应用时Eureka服务
public class EurekaServerApplication {
     
    public static void main(String[] args) {
     
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}
  1. 编写配置application.yml:
server:
  port: ${
     port:10086}
  #port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      # eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址
      defaultZone: ${
     defaultZone:http://127.0.0.1:10086/eureka}
      #defaultZone: http://127.0.0.1:10086/eureka
    # 不注册自己
    register-with-eureka: false
    # 不拉取服务
    fetch-registry: false
  server:
    #服务失效剔除间隔时间
    eviction-interval-timer-in-ms: 10000
    # 关闭自我保护
    enable-self-preservation: false
  1. 启动服务,并访问:http://127.0.0.1:10086/
    基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第4张图片

二、创建服务提供者

我们新建一个项目,对外提供查询用户的服务。在父工程下,创建子工程:

pom.xml文件


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-testartifactId>
        <groupId>com.hsxgroupId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>billmanagertk-serviceartifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
        dependency>
        
        <dependency>
            <groupId>tk.mybatisgroupId>
            <artifactId>mapper-spring-boot-starterartifactId>
        dependency>
        
        <dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelper-spring-boot-starterartifactId>
            <version>1.2.3version>
        dependency>
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-configartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-busartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-stream-binder-rabbitartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>

    dependencies>

project>

编写配置文件application.yml

server:
  port: ${
     port:9091}
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/bill-manager
    username: root
    password: 123
  application:
    name: billmanagertk-service
mybatis:
  type-aliases-package: com.hsx.billmanagertk.pojo
  mapper-locations: classpath:/mybatis/*.xml
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    ip-address: 127.0.0.1 # ip地址
    prefer-ip-address: true # 更倾向于使用ip,而不是host名
    lease-expiration-duration-in-seconds: 5 #服务失效时间,默认值90秒
    lease-renewal-interval-in-seconds: 5 #服务续约(renew)的间隔,默认为30秒

编写启动类

@SpringBootApplication
@MapperScan("com.hsx.billmanagertk.mapper")
@EnableDiscoveryClient //开启Eureka客户端发现功能
public class BillApplication {
     
    public static void main(String[] args) {
     
        SpringApplication.run(BillApplication.class,args);
    }
}

创建服务项目(bill服务的目录,如下图)

基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第5张图片

启动并测试

启动项目,访问http://localhost:9091/bill/findById/5
基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第6张图片

三、创建Spring Cloud Gateway网关

Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护。Spring Cloud Gateway本身也是一个微服务,需要注册到Eureka服务注册中心。
网关的核心功能是:过滤和路由
Gateway加入后的架构:
基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第7张图片

不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都可经过网关,然后再由网关来实现 鉴权、动态路由等等操作。Gateway就是我们服务的统一入口。

创建子项目:Gateway网关

pom.xml 文件


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-testartifactId>
        <groupId>com.hsxgroupId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>gateway-serverartifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-gatewayartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
    dependencies>

project>

编写启动类

@SpringBootApplication
@EnableDiscoveryClient //开启eureka注册发现功能
public class GatewayApplication {
     
    public static void main(String[] args){
     
        SpringApplication.run(GatewayApplication.class,args);
    }
}

编写配置application.yml

server:
  port: 8086
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: billmanagertk-service
          uri: lb://billmanagertk-service
          predicates:
            - Path=/api/bill/**
          filters:
            - StripPrefix=1
#            - MyParam=name
#      default-filters:
#        - AddResponseHeader=X-Response-Foo, Bar
#        - AddResponseHeader=myname, lxs
      globalcors:
        corsConfigurations:
          '[/**]':
            #allowedOrigins: * # 这种写法或者下面的都可以,*表示全部
            allowedOrigins:
              - "http://localhost:8080"
            allowedMethods:
              - GET
              - POST
              - PUT
              - DELETE
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000 #服务降级超时时间,默认1S
ribbon:
  ConnectTimeout: 1000 # 连接超时时长
  ReadTimeout: 2000 # 数据通信超时时长
  MaxAutoRetries: 0 # 当前服务器的重试次数
  MaxAutoRetriesNextServer: 0 # 重试多少次服务

说明:
启动多个Gateway服务,自动注册到Eureka,形成集群。如果是服务内部访问,访问Gateway,自动负载均衡,没问题。
但是,Gateway更多是外部访问,PC端、移动端等。它们无法通过Eureka进行负载均衡,那么该怎么办? 此时,可以使用其它的服务网关,来对Gateway进行代理。比如:Nginx

四、创建消费者

创建一个使用tomcat运行的web应用的消费者,通过ajax的方式进行数据交互,目录如下
基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第8张图片
运行tomcat截图:
基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第9张图片

页面展示数据获取: 消费者向网关发出请求,网关鉴权后路由到对应的服务提供者,然后提供者回应请求返回到网关,并通过网关返回给消费者。

写在最后,项目中还额外配置了Spring Cloud Config分布式配置中心(后续会更新这部分内容),一下是Eureka服务管理中心注册了的项目截图:
基于Eureka服务中心的SpringCloud搭建微服务架构的完整项目过程_第10张图片

你可能感兴趣的:(spring,cloud,java项目,java,spring,spring,cloud,微服务,微服务架构)