avatar

目录
SpringCloud 完整项目搭建

项目包括 eureka,feign,hystrix,ribbon

配置eureka服务端

1、修改pom.xml

xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?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.eureka</groupId>
<artifactId>server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.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>Finchley.RC2</spring-cloud.version>
</properties>
<dependencies>
<!-- 引入的Eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>

2、配置application.yml

yml
1
2
3
4
5
6
7
8
9
10
server:
port: 7001 #服务注册中心端口号
eureka:
instance:
hostname: 127.0.0.1 #服务注册中心IP地址
client:
registerWithEureka: false #是否向服务注册中心注册自己
fetchRegistry: false #是否检索服务
serviceUrl: #服务注册中心的配置内容,指定服务注册中心的位置
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3、添加启动注解@EnableEurekaServer

java
1
2
3
4
5
6
7
8
9
10
11
/**
* 启动一个服务注册中心
*/
@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {

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

配置eureka客户端 — 生产者

1、pom文件类似于eureka server

2、修改yml配置文件

yml
1
2
3
4
5
6
7
8
9
eureka:
client:
serviceUrl: #注册中心的注册地址
defaultZone: http://127.0.0.1:7001/eureka/
server:
port: 8081 #服务端口号
spring:
application:
name: service-provider #服务名称--调用的时候根据名称来调用该服务的方法

3、配置@EnableEurekaClient

java
1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableEurekaClient
public class EurekaProviderApplication {

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

}

配置eureka客户端 — 消费者

类似生产者自行配置即可。

集成Feign

生产者的pom文件添加依赖如下

xml
1
2
3
4
5
<!-- 项目中用到了Feign注解,引入此包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

1、开启Feign功能

java
1
2
3
4
5
6
7
8
9
10
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaProviderApplication {

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

}

2、定义接口并发送Feign请求

java
1
2
3
4
5
6
@FeignClient("SERVICE-CONSUMER") // value值是目标的微服务名称,大小写敏感。
@RestController
public interface ProviderController {
@GetMapping("/hello")
public String hello();
}

集成hystrix

准备

1、修改pom.xml

xml
1
2
3
4
5
<!-- 引入断路器依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2、启动类上加入注解@EnableHystrix

3、添加到application.yml

yml
1
2
3
feign:
hystrix:
enabled: true

Feign风格请求

1、新建EurekaFeignController

java
1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class EurekaFeignController {

@Resource
private EurekaFeignService eurekaFeignService;

@RequestMapping("/feignInfo")
public String feignInfo() {
String message = eurekaFeignService.getInfo();
return "获取到的信息:" + message;
}

}

2、新建EurekaFeignService

java
1
2
3
4
5
@FeignClient(value = "SERVICE-CONSUMER", fallback = EurekaFeignServiceFailure.class) // 调用的服务的名称
public interface EurekaFeignService {
@GetMapping(value = "/hello/hello")
public String getInfo();
}

3、新建EurekaFeignServiceFailure并继承EurekaFeignService

java
1
2
3
4
5
6
7
8
9
10
@Service
public class EurekaFeignServiceFailure implements EurekaFeignService {

@Override
public String getInfo() {
String message = "网络繁忙,请稍后再试-_-。PS:服务消费者自己提供的信息";
return message;
}

}

4、浏览器访问:http://localhost:8080/feignInfo

5、打印信息:正常访问远端微服务

6、断开远端微服务,重新访问http://localhost:8080/feignInfo

7、打印信息:网络繁忙,请稍后再试-_-。PS:服务消费者自己提供的信息

Rest风格请求

1、新建RibbonConsumerService

java
1
2
3
public interface RibbonConsumerService {
String client();
}

2、新建RibbonConsumerServiceImpl实现RibbonConsumerService

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
public class RibbonConsumerServiceImpl implements RibbonConsumerService{
/**
* 注入
*/
@Autowired
private RestTemplate restTemplate;

@HystrixCommand(fallbackMethod = "fallback")
@Override
public String client()
{
return restTemplate.getForObject("http://localhost:8081/hello/hello", String.class);
}

public String fallback()
{
return "这是fallback信息";
}

}

3、新建RestControllerImpl

java
1
2
3
4
5
6
7
8
9
10
11
12
@RestController
public class RestControllerImpl {

@Autowired
RibbonConsumerService ribbonConsumerService;

@GetMapping("/test")
public String runTest(){
return ribbonConsumerService.client();
}

}

4、浏览器访问:http://localhost:8080/test

5、打印信息:正常访问远端微服务

6、断开远端微服务,重新访问:http://localhost:8080/test

7、跳转到hystrix处理机制。并打印这是fallback信息

小结:带熔断器的项目写法和不带熔断器的项目写法

  • 前者主要是自己定义一个controller然后注入带有熔断器的feign接口。
  • 后者的话,可以直接在接口上定义feign注解和restcontroller注解,就可以正常接收和返回对象了。
  • 所以对比来看,不带熔断器的处理起来会方便一些。

集成Ribbon

  1. 修改BeanConfig,添加@LoadBalanced注解
java
1
2
3
4
5
6
7
8
9
@Configuration
public class BeanConfig {

@Bean
@LoadBalanced // 新增
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

这样可以实现两个目的,第一是通过rest请求微服务,第二是通过这种方式可以轮询访问多个微服务,达到负载均衡的效果。

Q&A

1、idea如何新建一个纯净的项目包括多个module??

项目目录如下:

image-20200529224054724

新建module的时候,一定要注意要在SpringCloudDemo01下新建一个子文件夹名字为:eureka-server,同时项目名称也为eureka-server。

2、如果想通过微服务的方式来发送rest请求,请求微服务,比如:http://SERVICE-CONSUMER/hello/hello ,那么就需要在构造RestTemplateBean的时候,加入@LoadBalanced

java
1
2
3
4
5
6
7
8
9
@Configuration
public class BeanConfig {

@Bean
@LoadBalanced // 需要加入这个注解
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

3、多个消费者注册同一个微服务名,通过rest请求,达到多个消费者进行负载均衡请求的效果。。

直接上图:

一共是两个微服务分别在两个端口80818082

打赏
  • 微信
    微信
  • 支付宝
    支付宝