spring-cloud开发笔记之微服务入门与Eureka服务端和客户端的搭建

4 篇文章 1 订阅
3 篇文章 0 订阅

1 微服务与Spring Cloud一些重要概念

1.1 什么是微服务?

       微服务就是把原本臃肿的一个项目的所有模块拆分开来并做到互相没有关联,甚至可以不使用同一个数据库。   比 如:项目里面有User模块和Power模块,但是User模块和Power模块并没有直接关系,仅仅只是一些数据需要交 互,那么就可以吧这2个模块单独分开来,当user需要调用power的时候,power是一个服务方,但是power需要 调用user的时候,user又是服务方了, 所以,他们并不在乎谁是服务方谁是调用方,他们都是2个独立的服务,这 时候,微服务的概念就出来了。 

1.2 经典问题:微服务和分布式的区别 
       谈到区别,我们先简单说一下分布式是什么,所谓分布式,就是将偌大的系统划分为多个模块(这一点和微服务很 像)部署到不同机器上(因为一台机器可能承受不了这么大的压力或者说一台非常好的服务器的成本可能够好几台 普通的了),各个模块通过接口进行数据交互,其实 分布式也是一种微服务。 因为都是吧模块拆分开来变为独立 的单元,提供接口来调用,那么 他们本质的区别在哪呢? 他们的区别主要体现在“目标”上, 何为目标,就是你这 样架构项目要做到的事情。 分布式的目标是什么? 我们刚刚也看见了, 就是一台机器承受不了的,或者是成本问 题 , 不得不使用多台机器来完成服务的部署, 而微服务的目标 只是让各个模块拆分开来,不会被互相影响,比如 模块的升级亦或是出现BUG等等...

讲了这么多,可以用一句话来理解:分布式也是微服务的一种,而微服务他可以是在一台机器上。
 

1.2 Spring Cloud简介

Spring Cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管平台。

1.3 微服务与Spring-Cloud的关系(区别)

     微服务只是一种项目的架构方式,或者说是一种概念,就如同我们的MVC架构一样, 那么Spring-Cloud便是对这 种技术的实现。 

1.4 微服务一定要使用Spring-Cloud吗? 

    微服务只是一种项目的架构方式,如果你足够了解微服务是什么概念你就会知道,其实微服务就算 不借助任何技术也能实现,只是有很多问题需要我们解决罢了例如:负载均衡,服务的注册与发现,服务调用,路 由等等一系列问题。所以Spring-Cloud 就出来了,Spring-Cloud将处理这些问题的的技术全部打包 好了,就类似那种开箱即用的感觉。微服务的开发框架很多,你也可以选择阿里巴巴的Dubbo框架开发微服务,只不过Dubbo是一个重型的微服务治理框架,在Spring Cloud火起来之前,国内很多公司大都是选择Dubbo框架开发微服务的。

2  Spring Cloud Netflix 模块介绍

2.1服务注册中心

        Spring Cloud Netflix通过自动配置和绑定到Spring环境和其他Spring编程模型习惯用法,为Spring引导应用程序提供了Netflix OSS集成。通过一些简单的注释,您可以快速启用和配置应用程序中的常见模式,并使用经过实战测试的Netflix组件构建大型分布式系统。提供的模式包括服务发现(Eureka)、断路器(Hystrix)、智能路由(Zuul)和客户端负载平衡(Ribbon)。

      在Spring Cloud微服务开发框架中,可以提供注册中心的提供注册中心的有3个子模块,分别是Spring Cloud Netflix提供的Eureka注册中心、Spring Cloud Consul提供的Consul注册中心和Spring Cloud Zookeeper提供的Zookeeper注册中心。这里主要介绍Spring Cloud Netflix模块中的Eureka Server和Eureka Client实战,后面有时间会上Spring Cloud Consul和Spring Cloud Zookeeper的实战代码,并比较它们之间的优缺点。

2.2 Eureka 注册中心

  •     eureka是Netflix的子模块之一,也是一个核心的模块,eureka里有2个组件,一个是EurekaServer(一个独立的项 目) 这个是用于定位服务以实现中间层服务器的负载平衡和故障转移,另一个便是EurekaClient(我们的微服务) 它是用于与Server交互的,可以使得交互变得非常简单:只需要通过服务标识符即可拿到服务。 
  • Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(可以对比Zookeeper)。
  • Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。 而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可 以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以 通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。 

        

 

2 Spring Cloud 项目搭建

    因为spring-cloud是基于spring-boot项目来的,所以我们项目得是一个spring-boot项目,至于spring-boot项目, 这篇博客不作讨论,这里要注意的一个点是spring-cloud的版本与spring-boot的版本要对应下图:

本人使用的是Spring Boot 2.0.2版本和Spring Cloud Finchly SR2版本,最新版本的Spring Boot已经到了2.16版本,Spring Cloud也到了Greenwich SR2版本。但是本人在家里搭建Eureka 服务端和客户端时发现采用Spring Boot 2.1.6版本和Spring Cloud Greenwich SR2版本时在项目启动时总是报了各种难以解决的异常(本人在公司搭建的ureka 服务端和客户端项目时发现采用Spring Boot 2.1.6版本和Spring Cloud Greenwich SR2版本项目启动时却没问题,自己也找不到具体原因 ),于是参考了鲁班学院商鞅老师之前的笔记并结合Spring Cloud官方文档采用了Spring Boot 2.0.2版本和Spring Cloud Finchly SR2版本才解决了项目启动时报错的Bug。废话不多说,下面直接上代码。

说明:本项目是在本人之前的一个2.1.4版本的Spring Boot聚合项目基础之上修改构建的

1) 使用IDEA 工具新建一个Maven项目,项目名称为spring-boot-samples, 然后新建2个子模块Spring Boot项目,分别是cloud-eureka-server1和cloud-eureka-client1 项目,并修改它们的Pom依赖

父项目的pom文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
    <packaging>pom</packaging>
    <modules>
        <module>cloud-eureka-server1</module>
        <module>cloud-eureka-client1</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hsf</groupId>
    <artifactId>spring-boot-samples</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-samples</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- 数据库连接池-->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>3.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <!--父项目只编译不打包 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <!-- 跳过单元测试 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

cloud-eureka-server1的Pom内容如下

<?xml version="1.0" encoding="UTF-8"?>
<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>spring-boot-samples</artifactId>
        <groupId>com.hsf</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-eureka-server1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <description>spring-cloud-netflix-eureka-server cluster project demo</description>

    <dependencies>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.netflix.eureka</groupId>
            <artifactId>eureka-core</artifactId>
            <version>1.9.3</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
cloud-eureka-client1项目的pom内容如下
<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
    <parent>
        <groupId>com.hsf</groupId>
        <artifactId>spring-boot-samples</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.hsf</groupId>
    <artifactId>cloud-eureka-client1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-eureka-client1</name>
    <description>Demo project for Spring Cloud Eureka Client</description>
    <packaging>jar</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.0.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-client</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey.contribs</groupId>
                    <artifactId>jersey-apache-client4</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- mysql驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>


    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2) 配置文件和启动类

cloud-eureka-server1 项目的resources目录下新建两个yaml文件,分别是application.yaml和application-dev.yaml

application.yaml内容如下

eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 5000 #默认 60*1000 单位:毫秒
  instance:
    hostname: peer1
  client:
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/
    registerWithEureka: false  #禁用自己注册
spring:
  profiles:
    active: dev
  application:
    name: eurekaServer1
  main:
    allow-bean-definition-overriding: true
  #必须配置freemark模板引擎参数,否则启动报错
  freemarker:
    template-loader-path: classpath:/templates/
    prefer-file-system-access: false

application-dev.yaml 内容如下:

server:
  port: 8761
  address: 127.0.0.1
#eureka 服务端和客户端项目必须配置数据源,否则启动报错
spring:
  datasource:
      type: com.zaxxer.hikari.HikariDataSource
      url: jdbc:oracle:thin:@localhost:1521:ORCL
      driverClassName: oracle.jdbc.driver.OracleDriver
      username: SYSTEM
      password: mypassword
EurekaServer1Application启动类上加上@EnableEurekaServer注解
package com.hsf.cloudeurekaserver1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer1Application {

    public static void  main(String[] args){

        SpringApplication.run(EurekaServer1Application.class,args);
    }
}

同样cloud-eureka-client1项目resources目录下新建application.yaml和application-dev.yaml文件

application.yaml

server:
  port: 9090
  connection-timeout: 30000s
  servlet:
    context-path: /eurekaClient

spring:
  profiles:
    active: dev
  application:
    name: eurekaClient
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useSSL=false
    username: root
    password: mypassword
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL57Dialect

logging:
  level:
    org:
      hibernate:
        SQL: debug
        type:
          descriptor:
            sql: trace

application-dev.yaml

eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka/

  instance:
    hostname: localhost
    instance-id: eurekaClient1  #实例注册到eureka服务器上的唯一实例ID
    lease-renewal-interval-in-seconds: 30   #过多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30s
    prefer-ip-address: true  #显示IP地址

在CloudEurekaClient1Application启动类上加上@EnableEurekaClient注解

package com.hsf.cloudeurekaclient1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class CloudEurekaClient1Application {

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

}

然后在你的windows系统中C盘的 C:\Windows\System32\drivers\etc 目录下修改hosts文件内容,加入peer的域名解析

# localhost name resolution is handled within DNS itself.
    127.0.0.1       localhost
    ::1             localhost
    127.0.0.1       peer1

4. 启动Eureka服务端和客户端项目

依次选中EurekaServer1Application启动类和CloudEurekaClient1Application启动类的main函数,右键选中Debug模式启动

两个项目启动成功后,在谷歌浏览器中输入 http://peer:8761, 回车后看到下图效果,则证明我们的eureka server注册中心和eureka client客户端搭建成功了!这里我们能看见 名字叫eurekaclient的(图中将其大写了) id为eurekaClient1的服务 注册到我们的Eureka注册中心上面来了 。至此,一个简单的eureka已经搭建好了

参考链接 

Spring Cloud Netflix官方文档开发指南: https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.2.0.M1/

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

heshengfu1211

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值