[Spring colud] spring cloud services to build [micro] spring boot2.0

Transfer: https://www.cnblogs.com/sxdcgaq8080/p/9035724.html

Bloggers related articles are good, ready to continue to have read!

 

spring cloud service project to build a micro

===================================

Example version:

1.spring boot version 2.0

2. Development Tools IntellJ IDEA

=================================== 

Some special point to note:

1. Create a spring boot project

2. Create a child module in the parent project [it] a long time I had a tangle

3. The relationship between father and son project level

Creating a cluster 4.eureka

Package the child module must ensure that the parent project has been packaged

Under 6.target everything can be deleted

7. Distributed command to start the cluster service

8.

===================================

Build a complete process spring cloud projects

1 on .idea create a new spring boot project , whose name is called spring cloud

 This step has not even click on a new window

 

[If you are using maven's words] Note that the new project to create a new future, idea on setting up maven address of the warehouse, it needs to be reset

 Wait jar package download is complete, the current step, the entire project is structured as follows: that is, a single spring boot program

pom.xml file download is initiated:

复制代码

<?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>

    <groupId>com.swapping</groupId>
    <artifactId>springcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springcloud</name>
    <description>Demo project for Spring Cloud</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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


</project>

复制代码

 

注意,有些idea自己的配置文件和项目没有多大关系的,可以选择忽略不显示这些文件,忽略文件的操作:https://www.cnblogs.com/sxdcgaq8080/p/9007883.html

注意,把杂七杂八的文件隐藏后,干净的项目显示如下

 

因为现在要创建的是spring cloud项目,所以在当前的pom.xml文件中添加依赖如下:【完全复制,替换原pom.xml文件内容即可】【注意项目jar包版本问题】【注意最后打包 时候 jar要改成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>

    <groupId>com.swapping</groupId>
    <artifactId>springcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!--
    注意 最后打包 最外层的pom 需要更改为 pom而不是jar
    <packaging>jar</packaging>
    -->
    <packaging>pom</packaging>

    <name>springcloud</name>
    <description>Demo project for Spring Cloud</description>

    <modules>
        <module>springcloud-ms-eureka</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>2.0.0.RELEASE</spring-cloud.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--最外层 主项目 添加spring cloud依赖 https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
            <version>${spring-cloud.version}</version>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


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


</project>

复制代码

 

 

 

2.创建本项目的子module,也就是创建一个项目的子模块

好了,现在进行第二步,在刚刚创建的项目上右键 创建子项目模块【Eureka 服务注册中心】

 

好,现在咱们看一下目前的项目结构

 

建立父子项目之间的联系

OK,可以看出来。现在子级module已经成功创建了,但是 并不是说这个eureka子级项目在springcloud父级项目下,就是父子级了,必须得声明一下,他们的父子级关系,

第一步》》》这个就需要在外层的父项目中的pom.xml文件中进行声明:

这个地方声明的子级项目的名字 对应的是自己项目的pom.xml文件中子级项目自己的名字

    <modules>
        <module>springcloud-ms-eureka</module>
    </modules>    

 

对应的是自己项目pom.xml文件中的名字

 

 

第二步》》》在子级的pom.xml文件中进行声明

子级pom.xml文件中添加如下:

    <parent>
        <groupId>com.swapping</groupId>
        <artifactId>springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

 

对应父级pom.xml中的

 

 

这样声明了以后,父子级项目的关系就建立起来了!!

父子级项目的处理咱们说道这里。

 

下面就看本微服务eureka的配置步骤:

第一步:

完善eureka微服务的完整的pom.xml文【注意spring boot2.0版本 eureka的jar包名字已经改变】

复制代码

<?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>

    <groupId>com.swapping</groupId>
    <artifactId>springcloud-ms-eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springcloud-ms-eureka</name>
    <description>eureka for project  </description>

    <parent>
        <groupId>com.swapping</groupId>
        <artifactId>springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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


</project>

复制代码

第二步:

在eureka微服务的启动类中添加注解@EnableEurekaServer

 

第三步:

完善eureka的配置文件properties文件【或者yml文件】

在完善之前,可以先去hosts文件做一个简单的小配置,有利于后续的一些展示

hosts文件位置如下:

 

 在hosts文件中添加:

127.0.0.1  swapping1
127.0.0.1  swapping2
127.0.0.1  swapping3

 

OK,现在完善配置文件

复制代码

#声明本服务在注册中心展示的名字、也是在网关访问时定位服务的名字
spring.application.name=spring-cloud-ms-eureka

#在windows下的hosts文件中增加了  127.0.0.1  swapping1
eureka.instance.hostname=swapping1
server.port=8000

#是否将自己作为服务注册到注册中心,默认为true,false不能将自己注册到自己,
#如果有多个服务注册中心的微服务的话,可以将这个设置为true,表示可以将注册中心1注册到注册中心2中
eureka.client.register-with-eureka=false
#表示是否从eureka注册中心中获取注册信息,默认为true
eureka.client.fetch-registry=false
#注册中心的交互地址,设置多个地址可以用,分隔  查询服务和注册服务都需要依赖这个地址
#关于设置注册中心这么关键的服务,如果是单点话,遇到故障就是毁灭性的。
#在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案
#所以 在一个分布式系统中,设置最少两个服务注册中心是最基本的
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

复制代码

 

 第四步》》》好了  最后启动服务,右键 启动 启动类或者在Run Dasboard右键启动

 

或者

 

如果因为jar包版本出错,解决方案:https://www.cnblogs.com/sxdcgaq8080/p/9314666.html

 

启动以后,按照刚刚eureka配置文件中配置的端口访问页面,或者在Run Dashboard中点击对应端口直接就在浏览器启动也可以

 

 

此刻显示 注册中心 中并没有服务注册

 

 

3.创建集群的Eureka【开发搭建分布式,可以跳过本步】【部署时候使用本步骤,开发时候使用第二步骤的单点服务注册中心 即可在满足本地使用】

既然咱们已经创建了单个的注册服务中心,那么如同上面所说,为了保证服务的高可用,那最起码应该启动两个服务注册,这里我们就开始在本机上启动多个服务注册中心,类似于创建集群。

还记得上面配置eureka的时候,配置了:

eureka.client.register-with-eureka=false

就是配置单点eureka的时候,禁止自己向自己注册。

现在配置多个服务注册中心集群,就可以相互注册到对方,即可实现高可用的部署,所以这个参数就可以设置为true了。

 

 

 第一步》修改刚刚erueka的配置文件

这个文件名称的修改原理,请查看:spring boot多资源环境

 

第二步》分别完善三个配置文件

application-swapping1.properties

View Code

application-swapping2.properties

View Code

application-swapping3.properties

View Code

 

第三步》分别打包最外层父级项目和内层的微服务

此时可以看到咱们的Run Dashboard中启动类已经找不到匹配的配置文件了。所以在平时开发的话,即可在本地采用上面的单点注册中心即可完成开发需求。

 

OK,这里需要注意一点,就是在打包任意ms微服务之前,必须保证,父级项目也就是最外层的项目已经打包成功了,因为所有子级的module都引用了父级的jar包依赖,如果父级项目未打包,那么子级module打包是不会成功的!!!

 

好的,首先打包父级项目或者最外层依赖的项目,然后依次打包进来

打包时候出现问题,可以参考这个地址:https://www.cnblogs.com/sxdcgaq8080/p/9314865.html

 

OK,外层的父级项目打包成功后,轮到了内层的eureka,咱们要建集群的微服务进行打包

 

第四步》利用三个不同的配置文件,启动不同端口的服务注册中心,创建集群

第三步打包成功的jar包,可以在本服务的target中找到【注意,target下所有东西都可以删除掉,因为target下所有文件都是编译以后的结果】

 

 OK,开始分别启动这三个服务注册中心了

需要先在idea命令窗口走到咱们打包的jar包存放的位置:

 

在idea上的命令窗口键入命令:

java -jar springcloud-ms-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=swapping1

 

 

 然后分别以swapping2和swapping3启动服务注册中心【这个时候,就体会到了修改hosts文件的妙处了吧!!!】

java -jar springcloud-ms-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=swapping2

 

java -jar springcloud-ms-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=swapping3

 

 注意下面 并没有 进入target目录中,仅作为开启新页签的展示操作 ,如果要启动成功,需要cd到target目录下进行操作

如果启动报错,可以参考:https://www.cnblogs.com/sxdcgaq8080/p/9315197.html

 

OK,正常启动完第一个服务。应该是会报错连接失败,因为它要注册的地址服务2和服务3都还没有正式启动,直到三个服务都成功启动了,才会都正常了。

后面的服务启动成功。前面的服务会注册的到的!!!!

 

然后分别打开页面查看

 

OK  到这里  eureka集群 就成功搭建完成了!!!

========================================

 

4. 创建分布式系统中的服务提供者和服务消费者,并提供Feign进行服务调用

 上面两步中,把spring cloud创建分布式系统的核心步骤,创建单个Eureka服务注册中心 以及 注册中心集群。

【ms---代表微服务的意思】【DB---代表数据库】

既然是分布式系统,当然是有做这个系统核心业务的一个一个的ms微服务。而这一个一个的ms微服务都是根据不同的业务功能进行划分模块的。

举个简单的例子:

  场景:在一个商城系统中,一个会员,购买一个商品,然后相应的这个会员也会获取一定的积分【关于微服务的抽离以及数据库需不需要独立设计,完全取决于实际场景】

    1.商品--ms-goods有关商品的,可以抽离出来成一个ms微服务,连接一个独立的DB--goods

    2.会员--ms-member有关会员的,可以抽离出来 一个单独的ms微服务,连接一个独立的DB--member

    3.积分--ms-integral 有关积分的,可以单独抽离成一个ms微服务,连接一个独立的DB--integral或者integral作为一张表,存在于DB--member数据库中

  关于场景:在这个简单的场景中,会涉及到几个操作

    1.购买操作从member会员服务发起

    2.商品服务提供购买商品的接口,接口功能就是购买商品的这个服务,对应的goods数据库中,商品数量减1

    3.积分服务同样需要提供一个更改积分的接口,接口功能就是会员对应的购物积分有所增加,比如增加商品等价的积分

 

好,看了上面这个简单的例子,其中涉及到的一些问题和一些要说的东西就显现出来了。【黑粗标记就是重点】

    1.首先理解一个概念,就是现在关于商品的操作【操作就简单的理解成CRUD增删改查】都在商品服务里面,关于会员的操作都在会员服务里面。

    2.所以,如果想要在会员做了购买商品的动作后,想要在会员服务中调用商品服务中的购买服务,就涉及到了跨微服务调用的情况

    3.这样就引申出了服务提供者服务消费者这样的概念,而在上面的这种情况中,商品服务就是服务提供者,会员服务就是服务调用者

    4.而服务消费者想要调用到服务提供者提供的功能服务,则需要商品服务除了在服务内部提供 购买商品 的接口外,还需要提供接口对应的Feign,这样会员服务才能调用到商品服务内部的接口功能。

    5.会员购买,商品减1,积分增加,这整个的流程如果中间哪一步失败,怎么办?肯定要保证这整个的流程要么全部成功,要么全部失败,这就是事务的原子性,这里也就涉及到了分布式事务的概念,而分布式事务也是分布式系统中的难点!【分布式事务最后再说】

    

 

 

 

 

结尾

10.分布式事务

分布式事务实现的思想:

分布式事务=本地事务【原子事务】+异步【消息通知】

发布了107 篇原创文章 · 获赞 36 · 访问量 123万+

Guess you like

Origin blog.csdn.net/zoucui/article/details/95990335