Spring Cloud Eureka + Openfeign 搭建

32 篇文章 0 订阅
21 篇文章 0 订阅

要开新项目啦,哈哈哈
这回是个分布式微服务项目,所以先来实践一下。

架构使用spring boot2.1.1,  jdk8,其实想用JDK11的,但是考虑到后面有可能会应用到项目中,所以直接JDK8吧。

IDE用STS4.

1,注册中心eureka

现在的微服务不能保证每个节点永远不出现问题,所以我们需要注册和发现中心,我理解eureka主要作用就是进行微服务的自动注册和发现,以及心跳检测和配合其他框架进行负载均衡。

实现就比较简单了。直接使用sts带的spring starter project即可。给几个截图吧。

后面一路finish。

然后等待IDE自己加载maven包即可。其实就是一个spring boot项目。

看一下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>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.travelsky.eureka</groupId>
	<artifactId>travelsky-eureka</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>travelsky-eureka</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
	</properties>

	<dependencies>
		<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>
	</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>
		</repository>
	</repositories>

</project>

然后我们进行一些简单配置。

1,启动类添加eureka注解。

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

@SpringBootApplication
@EnableEurekaServer //代表开启eureka注册中心
public class TravelskyEurekaApplication {

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

}

2,yml配置

server:
  port: 8081 #服务注册中心端口号
eureka:
  instance:
    hostname: 127.0.0.1 #服务注册中心IP地址
  client:
    registerWithEureka: false #是否向服务注册中心注册自己
    fetchRegistry: false #是否检索服务
    serviceUrl: #服务注册中心的配置内容,指定服务注册中心的位置
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

好了,然后我们启动一下项目,http://localhost:8081

 

 这里我们的eureka就启动好了。里面的注册的服务会展示在Instances currently registered with Eureka这里。

关于eureka的其他内容,下次再再单独讲。今天主要说一下搭建启动过程。 

这里讨论三个注解:

@EnableEurekaServer:对于eureka来说,他是服务端,所以这个注解是用来启动eureka的。

@EnableDiscoveryClient:这个注解也是把服务注册到注册中心,但是他可以支持多个注册中心。

@EnableEurekaClient:和@EnableDiscoveryClient的功能一致,但是只支持eureka注册。

 

2,eureka客户端

这里是需要注册到eureka中的每个微服务,也就是实际开发中我们的业务项目。

其实每个微服务既可以是服务提供者也可以是服务消费者;对于eureka来说他们都是客户端。

这里我们搭建两个项目,模拟一个提供者,一个消费者。

 服务提供者

注意这里选的是discovery表示服务发现。

看一下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>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.travelsky.client.test</groupId>
	<artifactId>travelsky-client-test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>travelsky-client-test</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
<!-- 		<dependency> -->
<!-- 			<groupId>org.springframework.cloud</groupId> -->
<!-- 			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> -->
<!-- 		</dependency> -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</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>
		</repository>
	</repositories>

</project>

然后是在启动类上加上注解

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

@SpringBootApplication
@EnableEurekaClient
public class TravelskyClientTestApplication {

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

}

然后配置一些配置文件

eureka:
  client:
    serviceUrl: #注册中心的注册地址
      defaultZone: http://127.0.0.1:8081/eureka/
  instance:
    lease-renewal-interval-in-seconds: 1  #每间隔1s,向服务端发送一次心跳,证明自己依然”存活“
    lease-expiration-duration-in-seconds: 2 #告诉服务端,如果我2s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
server:
  port: 8082  #服务端口号
spring:
  application:
    name: client-test #服务名称--调用的时候根据名称来调用该服务的方法

 

让我们来暴露有一个接口。

import java.util.HashMap;
import java.util.Map;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ClientTestController {

	@GetMapping("/get1/{id}")
	public Map<String, String> get1(@PathVariable("id")String id) throws Exception{
//		throw new Exception("sssssssssssssssssss");
		Map<String, String> map = new HashMap<>();
		map.put("id", id);
		map.put("name", "wm");
		map.put("from", "client-test");
		return map;
	}
}

 

好了,服务提供者我们写完了。下面写一个服务的消费者,同样的操作就不做了。看一下不一样的。

服务消费者及openfeign使用

看一下消费者的pom文件

多了feign的支持,spring boot1时就叫feign,升级到2.0后改名叫openfeign了。

<?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>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.travelsky.consumer.test</groupId>
	<artifactId>travelsky-consumer-test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>travelsky-consumer-test</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</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>
		</repository>
	</repositories>

</project>

下面是配置文件YML

eureka:
  client:
    serviceUrl: #注册中心的注册地址
      defaultZone: http://127.0.0.1:8081/eureka/
  instance:
    lease-renewal-interval-in-seconds: 1  #每间隔1s,向服务端发送一次心跳,证明自己依然”存活“
    lease-expiration-duration-in-seconds: 2 #告诉服务端,如果我2s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
server:
  port: 8060  #服务端口号
spring:
  application:
    name: travelsky-consumer-test #服务名称--调用的时候根据名称来调用该服务的方法
feign:  
  hystrix: 
    enabled: true #设置这个参数failBack才会生效
# 心跳检测检测与续约时间
# 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
  

 

启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class TravelskyConsumerTestApplication {

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

这里多了一个注解,使用了@EnableFeignClients,这个是为了使用feign进行声明式配置引入的。

然后写一个消费者请求入口

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.travelsky.consumer.test.service.ConsumerTestService;

@RestController
public class ConsumerTestController {
	
	@Autowired
	private ConsumerTestService service;

	@GetMapping("/get1/{id}")
	public Map<String, String> get1(@PathVariable("id")String id){
		Map<String, String> getMap = service.get1(id);
		return getMap;
	}
}

 feign调用接口

@FeignClient是使用feign时调用其他微服务的注解。

name:是指要调用的微服务的名称,和其他微服务中配置的spring.application.name的值相对应。并不是URL形式,所以不要带斜杠。

fallback:feign集成了hystrix的熔断器。当出现服务调用不可用时,为了防止雪崩效应,使用熔断器及时熔断进行服务降级。

fallbackFactory:同样是hystrix熔断器,再上面基础上可以返回异常信息。

//name中不能带斜杠
@FeignClient(name="client-test",fallback=ConsumerTestServiceImpl.class)
public interface ConsumerTestService {

	@GetMapping("/get1/{id}")
	public Map<String, String> get1(@PathVariable("id")String id);
}

 fallback熔断器的自身处理类

@Service
public class ConsumerTestServiceImpl implements ConsumerTestService{

	@Override
	public Map<String, String> get1(String id) {
		Map<String, String> mapFailBack = new HashMap<String, String>();
		mapFailBack.put("id", id);
		mapFailBack.put("name", "travelsky");
		mapFailBack.put("from", "consumer-test");
		return mapFailBack;
	}

}

fallbackFactory熔断器处理类

@Component
public class ConsumerTestFallbackFactory implements FallbackFactory<ConsumerTestService> {

	@Override
	public ConsumerTestService create(Throwable cause) {
		return new ConsumerTestService() {
			
			@Override
			public String get1(String id) {
				return "ERROR:"+ cause.getMessage();
			}
		};
	}

}

 

这里一定要注意:

feign:  
  hystrix: 
    enabled: true #设置这个参数failBack才会生效

必须打开此项配置。不然fallback不会生效。

 

 

启动项目进行测试,先启动eureka服务端,再启动消费者和提供者。

测试很简单,访问消费者的外部暴露接口。得到服务提供者提供的数据。

这里就不贴图了。到这里erueka + feign 简单使用就搭建完了。 还有更深入的比如eureka的,或者feign的其他属性如何使用。

就有空再开帖子写吧。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值