• 微服务项目框架搭建


    一. 服务说明

    1. eureka-server                ------> 注册中心
    2. member-service             ------> 会员服务接口
    3. member-service-impl      ------> 会员服务实现
    4. order-service                  ------> 订单服务接口
    5. order-service-impl          -------> 会员服务实现

            补充说明: 之后要创建member-service,order-service两个接口服务,是为了提高代码的覆用性.具体可参见后面的代码

    二.创建项目

    1.整体结构

                      

    2.创建springcloud-hystrix父工程

       2.1 创建一个maven项目(略)

            2.1 pom.xml依赖

    <?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>qinfeng.zheng</groupId>
    <artifactId>springcloud-hystrix</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
    <module>eureka-server</module>
    <module>member-service</module>
    <module>member-service-impl</module>
    <module>order-service</module>
    <module>order-service-impl</module>
    </modules>

    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.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>

    <!-- 管理依赖 -->
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Finchley.M7</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>
    <dependencies>
    <!-- SpringBoot整合Web组件 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- SpringBoot整合eureka客户端 -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- SpringBoot整合fegnin客户端 -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    </dependency>
    <!-- hystrix断路器 -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

    </dependencies>
    <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
    <repositories>
    <repository>
    <id>spring-milestones</id>
    <name>Spring Milestones</name>
    <url>https://repo.spring.io/libs-milestone</url>
    <snapshots>
    <enabled>false</enabled>
    </snapshots>
    </repository>
    </repositories>
    </project>

     

    3.创建eureka-service子模块--->注册中心

      3.1 创建一个maven工程

      3.2 pom.xml依赖

      <?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>springcloud-hystrix</artifactId>
    <groupId>qinfeng.zheng</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

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

       

      3.3 在resources目录下创建application.yml文件

    ###服务端口号
    server:
    port: 8888
    ##定义服务名称
    spring:
    application:
    name: eureka-server
    eureka:
    instance:
    ###注册中心ip地址
    hostname: 127.0.0.1
    client:
    serviceUrl:
    ##注册地址
    defaultZone: http://${eureka.instance.hostname}:8888/eureka/
    ####因为自己是注册中心,是否需要将自己注册给自己的注册中心(集群的时候是需要是为true
    register-with-eureka: false
    ###因为自己是注册中心, 不需要去检索服务信息
    fetch-registry: false
    server:
    # 测试时关闭自我保护机制,保证不可用服务及时踢出,,,若要及时踢出过期服务,还需要在客户端进行配置
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 2000

      

      3.4 创建注册中心启动类

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApp {
    public static void main(String[] args){
    SpringApplication.run(EurekaServerApp.class, args);
    }
    }

          

       3.5 启动该服务,浏览器访问

      

        

    4. 创建member-service,会员接口项目

            4.1 创建使用maven工程,略

            4.2 pom.xml继承父工作 springcloud-hystrix

    <?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>springcloud-hystrix</artifactId>
    <groupId>qinfeng.zheng</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>member-service</artifactId>
    </project>

       

      4.2 创建接口

           qinfeng.zheng.api.service.MemberService

    package qinfeng.zheng.api.service;

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;

    /**
    * 创建时间: 13:31 2018/9/16
    * 修改时间:
    * 编码人员: ZhengQf
    * 版 本: 0.0.1
    * 功能描述:
    */
    @RequestMapping("/member")
    public interface MemberService {

    @RequestMapping("/getMemberInfo")
    String getMemberInfo(@RequestParam("username") String username);
    }

       

    5. 创建memebre-service-impl,会员服务的具体实现

      5.1创建maven工程,略

      5.2 pom.xml依赖

    <?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>springcloud-hystrix</artifactId>
    <groupId>qinfeng.zheng</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>member-service-impl</artifactId>
    <dependencies>
    <!--依赖member-service工作,需要它的接口,减少重复代码-->
    <dependency>
    <groupId>qinfeng.zheng</groupId>
    <artifactId>member-service</artifactId>
    <version>1.0-SNAPSHOT</version>
    </dependency>
    </dependencies>

    </project>

       

      5.3 创建接口的具体实现逻辑 

      qinfeng.zheng.api.serice.impl.MemberServiceImpl

    package qinfeng.zheng.api.serice.impl;

    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import qinfeng.zheng.api.service.MemberService;

    /**
    * 创建时间: 13:34 2018/9/16
    * 修改时间:
    * 编码人员: ZhengQf
    * 版 本: 0.0.1
    * 功能描述:
    */
    @RestController
    public class MemberServiceImpl implements MemberService{
    @Override
    public String getMemberInfo(@RequestParam("username") String username) {
    try {
    Thread.sleep(3000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    return username +",调用会员服务的getMemberInfo方法成功...";
    }
    }

     

      5.4 创建application.yml文件

    ###服务启动端口号
    server:
    port: 8001
    ###服务名称(服务注册到eureka名称)
    spring:
    application:
    name: client-member
    ###服务注册到eureka地址
    eureka:
    client:
    service-url:
    defaultZone: http://localhost:8888/eureka
    ## 客户端间隔30s重新读eureka中服务信息
    registry-fetch-interval-seconds: 30

    # 心跳检测检测与续约时间
    # 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
    instance:
    ###Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)
    lease-renewal-interval-in-seconds: 1
    ####Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
    lease-expiration-duration-in-seconds: 2

     

      5.5 创建服务启动类

    package qinfeng.zheng;

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

    /**
    * 创建时间: 13:35 2018/9/16
    * 修改时间:
    * 编码人员: ZhengQf
    * 版 本: 0.0.1
    * 功能描述:
    */
    @SpringBootApplication
    @EnableEurekaClient
    public class MemberApp {
    public static void main(String[] args){
    SpringApplication.run(MemberApp.class, args);
    }
    }

       

      5.6 启动服务

     5.6.1 查看注册中心

    5.6.2 接口测试

       测试通过,服务正常!!!

     

    6.创建order-service服务

      创建过程与member-service一致.

      接口方法如下:qinfeng.zheng.api.service.OrderService

      package qinfeng.zheng.api.service;

    import org.springframework.web.bind.annotation.RequestMapping;

    /**
    * 创建时间: 13:43 2018/9/16
    * 修改时间:
    * 编码人员: ZhengQf
    * 版 本: 0.0.1
    * 功能描述:
    */
    @RequestMapping("/order")
    public interface OrderService {
      String getInfoFromMemberService(String username);
    }

     

    7.创建order-service-impl服务

      7.1 创建maven工程,略

      7.2 pom.xml依赖

    <?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>springcloud-hystrix</artifactId>
    <groupId>qinfeng.zheng</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>order-service-impl</artifactId>
    <dependencies>
    <dependency>
    <groupId>qinfeng.zheng</groupId>
    <artifactId>order-service</artifactId>
    <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
    <groupId>qinfeng.zheng</groupId>
    <artifactId>member-service</artifactId>
    <version>1.0-SNAPSHOT</version>
    </dependency>
    </dependencies>

    </project>
      

       

      7.3 使用feign客户端调用member服务接口

      qinfeng.zheng.api.service.feign.MemberFeign

    package qinfeng.zheng.api.service.feign;

    import org.springframework.cloud.openfeign.FeignClient;
    import qinfeng.zheng.api.service.MemberService;
    import qinfeng.zheng.api.service.feign.fallback.MemberFallBack;

    /**
    * 创建时间: 14:01 2018/9/16
    * 修改时间:
    * 编码人员: ZhengQf
    * 版 本: 0.0.1
    * 功能描述:
    */
    @FeignClient(name = "client-member",fallback = MemberFallBack.class)
    public interface MemberFeign extends MemberService {
    }

     

       7.4 hystrix服务保护(使用继承类的方式做服务保护)

      qinfeng.zheng.api.service.feign.fallback.MemberFallBack

    package qinfeng.zheng.api.service.feign.fallback;

    import org.springframework.web.bind.annotation.RequestParam;
    import qinfeng.zheng.api.service.feign.MemberFeign;

    /**
    * 创建时间: 14:46 2018/9/16
    * 修改时间:
    * 编码人员: ZhengQf
    * 版 本: 0.0.1
    * 功能描述:
    */
    public class MemberFallBack implements MemberFeign {
      @Override
      public String getMemberInfo(@RequestParam("username") String username) {
        return "rpc挂了,还是走本地服务降级方法吧";
      }
    }

       

      7.5 调用member服务的具体实现

      qinfeng.zheng.api.service.impl.OrderServiceImpl

    package qinfeng.zheng.api.service.impl;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import qinfeng.zheng.api.service.OrderService;
    import qinfeng.zheng.api.service.feign.MemberFeign;
    import qinfeng.zheng.api.service.feign.fallback.MemberFallBack;

    /**
    * 创建时间: 13:52 2018/9/16
    * 修改时间:
    * 编码人员: ZhengQf
    * 版 本: 0.0.1
    * 功能描述:
    */
    @RestController
    public class OrderServiceImpl extends MemberFallBack implements OrderService {
    @Autowired
    private MemberFeign memberFeign;
    @Override
    @RequestMapping("/getInfoFromMemberService") //映射url也可以放在接口方法上面
    public String getInfoFromMemberService(String username) {
    return memberFeign.getMemberInfo(username);
    }
    }
     

       

      7.6 application.yml

    ###服务启动端口号
    server:
    port: 8002
    ###服务名称(服务注册到eureka名称)
    spring:
    application:
    name: client-order
    ###服务注册到eureka地址
    eureka:
    client:
    service-url:
    defaultZone: http://localhost:8888/eureka


    ## 客户端间隔30s重新读eureka中服务信息
    registry-fetch-interval-seconds: 30

    # 心跳检测检测与续约时间
    # 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
    instance:
    ###Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)
    lease-renewal-interval-in-seconds: 1
    ####Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
    lease-expiration-duration-in-seconds: 2


    ###SpringCloud Feign客户端Http调用工具,默认已经整合了Ribbon负载均衡客户端
    ###设置feign客户端超时时间
    ribbon:
    ###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
    ReadTimeout: 5000
    ###指的是建立连接后从服务器读取到可用资源所用的时间。
    ConnectTimeout: 5000


    ##开启Hystrix断路器
    feign:
    hystrix:
    enabled: true
    #### hystrix禁止服务超时时间,也就是说它不会走fallback方法,如果不配置这里,默认1秒内rpc不响应,就走fallback方法
    hystrix:
    command:
    default:
    execution:
    # timeout:
    ### 直接将hystrix禁止服务超时时间禁掉, 这样永远不会走fallback方法了
    # enabled: false
    isolation:
    thread:
    #### 设置hystrix的超时时间, 如果2秒内rpc响应,浏览器正常响应,超过2秒走fallback方法
    timeoutInMilliseconds: 2000

       

      7.7 创建启动类

      qinfeng.zheng.OrderApp

    package qinfeng.zheng;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
    import org.springframework.cloud.openfeign.EnableFeignClients;

    /**
    * 创建时间: 14:00 2018/9/16
    * 修改时间:
    * 编码人员: ZhengQf
    * 版 本: 0.0.1
    * 功能描述:
    */
    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients
    @EnableHystrix
    public class OrderApp {
    public static void main(String[] args){
    SpringApplication.run(OrderApp.class, args);
    }
    }

       

      7.8 启动服务,测试

    7.8.1 查看eureka注册中心

    7.8.2 接口测试

    经测试,浏览器请求order服务的接口,走了服务降级方法,原因是:order-service-impl服务的application.yml中hystrix配置的超时时间是2000ms(它的意思是:如果调用服务接口时,2s内不能正常响应,那么就走本地的服务降级方法),而我们在member-service-impl服务的getMemberInfo接口内模拟业务逻辑,sleep(3000). 所以,对于order端而言,肯定超时,走服务降级方法.

    如果我们将order-service-impl服务application.yml中超时时间改成5s,重启服务,再测试

     

     

      测试接口,响应正常的接口内容,正确!!!

      至此,使用SpringCloud搭建微服务项目完成.

     

          

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    日拱一卒无有尽,功不唐捐终入海
  • 相关阅读:
    浙大数据结构课后习题 练习二 7-2 Reversing Linked List (25 分)
    浙大数据结构课后习题 练习二 7-2 一元多项式的乘法与加法运算 (20 分)
    浙大数据结构课后习题 练习一 7-1 Maximum Subsequence Sum (25 分)
    浙大数据结构课后习题 练习一 7-1 最大子列和问题 (20 分)
    PAT Basic 1019 数字黑洞 (20 分)
    PAT Basic 1017 A除以B (20 分)
    PAT Basic 1013 数素数 (20 分)
    PAT Basic 1007 素数对猜想 (20 分)
    PAT Basic 1003 我要通过! (20 分)
    自动化运维——HelloWorld(一)
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/9656121.html
Copyright © 2020-2023  润新知