erueka分为2部分。1:服务注册中心 2:服务提供者。一个基于erueka的项目必须要有服务注册中心,服务注册中心实际就相当于zookper,用来管理服务。
本内容基于springboot2.0
内容为自己学习和项目实战中的理解和总结如有错误,或者补充。请下方留言
文章源码 https://download.csdn.net/download/hykwhjc/11432004
目录
一:笔记
erueka是基于http的rest风格,都是通过controller层进行调用,区别就是erueka是通过服务名称进行调用,而不是具体的url地址。所以即使提供方改变了服务地址或者端口号,只要注册的服务中心没有变化,消费者不做任何更改仍可以调通。
1.服务注册中心:
重点步骤:
1.pom添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.启动类上添加@EnableEurekaServer
1.1单点注册中心:
在配置文件中加入以下配置:
#不向注册中心注册自己
eureka.client.register-with-eureka=false
#取消检索服务
eureka.client.fetch-registry=false
解释:表明自己是一个eureka server. 不将自己注册进去。
1.2高可用注册中心:
启动多个注册中心,在配置中使各个注册中心相互注册(代码一致,使用不同的配置文件即可):
即eureka.client.serviceUrl.defaultZone配置填入集群中另外的server服务端的地址
例:
配置文件:
server.port=1111
spring.application.name=eureka-server #同一集群下注册中心必须使用同一服务名!!!!!
eureka.instance.hostname=localhost
eureka.client.serviceUrl.defaultZone=http://localhost2:1112/eureka/
server.port=1112
spring.application.name=eureka-server #同一集群下注册中心必须使用同一服务名!!!!!
eureka.instance.hostname=localhost2
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
解释:将自己作为服务向其他服务注册中心注册自己,形成一组互相注册的服务注册中心,以实现服务清单相互同步,达到高可用的效果。其中一个注册中心宕机后注册中心仍可用。
服务提供者配置文件也进行相应修改,eureka.client.serviceUrl.defaultZone属性将所有的注册中心地址以“,”分割(部分注册中心也可以)
例:
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka,http://localhost2:1112/eureka
配置好后启动注册中心时会报错
com.netflix.discovery.DiscoveryClient : DiscoveryClient_EUREKA-SERVER/bogon:eureka-server:1112 - was unable to send heartbeat!
此错误可以忽略,意思是找不到注册地址,将注册的另一个注册中心启动后此错误就会消失。
2:服务提供者
eureka不区分服务消费者与提供者,统称为服务提供者。每一个服务都可以充当消费者或者提供者
重点步骤:
1.pom添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.启动类上添加@EnableEurekaClient
配置文件
server.port=8090
spring.application.name=eureka-provide
#服务注册地址
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka,http://localhost2:1112/eureka
在启动类中配置以下代码,使服务调用具有基于ribbon的负载均衡效果
//使restTemplate具有负载均衡的效果
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate ();
}
二:服务注册中心
2.1pom文件:
<?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.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<packaging>jar</packaging>
<groupId>eureka.server</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</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.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>
</project>
2.2启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
2.3配置文件:
server.port=1111
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.instance.hostname=localhost
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
三:服务提供者
3.1pom文件
<?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.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>springcloud.eureka.provide</groupId>
<artifactId>eureka-provide</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-provide</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</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.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>
</project>
为了演示eureka的服务调用,创建服务提供者(eureka-provide)和服务消费者(eureka-consumer)2个服务
3.1服务提供者
3.1.1启动类
@EnableEurekaClient
@SpringBootApplication
public class EurekaProvideApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProvideApplication.class, args);
}
}
3.2.1配置文件
server.port=8090
spring.application.name=eureka-provide
#服务注册地址
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka,http://localhost2:1112/eureka
eureka.client.serviceUrl.defaultZone属性将所有的注册中心都写上
3.2.3写一个controller
@RestController
public class Hellcontroller {
@Autowired
private Registration getServiceId;// 服务注册
@Autowired
private DiscoveryClient client;
@GetMapping(value = "/hello")
public String index() {
List <ServiceInstance> instances = client.getInstances (getServiceId.getServiceId ());
if (instances != null && instances.size () > 0) {
System.out.println ("/hello,host:" + instances.get (0).getHost () + ", service_id:" + instances.get (0).getServiceId ());
}
return "hello,provider";
}
服务提供者可以用使用集群方式(用不同的端口号启动多个服务提供者即可),消费者在启动类中配置RestTemplate的属性就会采用ribbon的负载均衡策略进行调用,后面会介绍如何使用。
3.2服务消费者
3.2.1配置文件
server.port=8092
spring.application.name=eureka-consumer
eureka.client.serviceUrl.defaultZone=http://localhost:1112/eureka
eureka.client.serviceUrl.defaultZone属性只需要写其中一个注册中心即可,即使这个注册中心挂了仍然可以调通
3.2.2启动类
@EnableEurekaClient
@SpringBootApplication
public class EurekaConsumerApplication {
//使restTemplate具有负载均衡的效果
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate ();
}
public static void main(String[] args) {
SpringApplication.run (EurekaConsumerApplication.class, args);
}
}
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate ();
}
使RestTemplate具有负载均衡效果
3.2.3写个controller,调用服务提供者
重点:调用的url地址写的是提供者的服务名而不是url地址
@RestController
public class HelloController {
@Resource
RestTemplate restTemplate;
@RequestMapping("/hello")
public String hello(){
return restTemplate.getForEntity ("http://eureka-provide/hello",String.class).getBody ();
}
}