微服务项目框架搭建

一. 服务说明

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

 

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

日拱一卒无有尽,功不唐捐终入海
原文地址:https://www.cnblogs.com/z-qinfeng/p/9656121.html