zoukankan      html  css  js  c++  java
  • 微服务项目框架搭建

    一. 服务说明

    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搭建微服务项目完成.

     

          

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    日拱一卒无有尽,功不唐捐终入海
  • 相关阅读:
    log4j日志格式化
    日志级别是如何工作?
    Java拦截过滤器模式
    js实现图片轮播
    js实现表格的增删改查
    企业外贸网站建设的要求及注意事项
    逛知乎才知网站建设不只有wordpress建站系统,小白值得收藏
    三款适用于企业建站的CMS建站系统
    前端开发常用的网站整理
    网站建设教程:虚拟主机如何安装PageAdmin建站系统
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/9656121.html
Copyright © 2011-2022 走看看