erueka分为2部分。1:服务注册中心 2:服务提供者。一个基于erueka的项目必须要有服务注册中心,服务注册中心实际就相当于zookper,用来管理服务。
本内容基于springboot2.0
内容为自己学习和项目实战中的理解和总结如有错误,或者补充。请下方留言
文章源码 https://download.csdn.net/download/hykwhjc/11432004
目录
一:笔记
1.服务注册中心:
1.1单点注册中心:
1.2高可用注册中心:
2:服务提供者
二:服务注册中心
2.1pom文件:
2.2启动类:
2.3配置文件:
三:服务提供者
3.1pom文件
3.1服务提供者
3.1.1启动类
3.2.1配置文件
3.2.3写一个controller
3.2服务消费者
3.2.1配置文件
3.2.2启动类
3.2.3写个controller,调用服务提供者
erueka是基于http的rest风格,都是通过controller层进行调用,区别就是erueka是通过服务名称进行调用,而不是具体的url地址。所以即使提供方改变了服务地址或者端口号,只要注册的服务中心没有变化,消费者不做任何更改仍可以调通。
重点步骤:
1.pom添加依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
2.启动类上添加@EnableEurekaServer
在配置文件中加入以下配置:
#不向注册中心注册自己
eureka.client.register-with-eureka=false
#取消检索服务
eureka.client.fetch-registry=false
解释:表明自己是一个eureka server. 不将自己注册进去。
启动多个注册中心,在配置中使各个注册中心相互注册(代码一致,使用不同的配置文件即可):
即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!
此错误可以忽略,意思是找不到注册地址,将注册的另一个注册中心启动后此错误就会消失。
eureka不区分服务消费者与提供者,统称为服务提供者。每一个服务都可以充当消费者或者提供者
重点步骤:
1.pom添加依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
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 ();
}
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
jar
eureka.server
eureka-server
0.0.1-SNAPSHOT
eureka-server
Demo project for Spring Boot
1.8
Greenwich.SR2
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
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);
}
}
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/
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
springcloud.eureka.provide
eureka-provide
0.0.1-SNAPSHOT
eureka-provide
Demo project for Spring Boot
1.8
Greenwich.SR2
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
为了演示eureka的服务调用,创建服务提供者(eureka-provide)和服务消费者(eureka-consumer)2个服务
@EnableEurekaClient
@SpringBootApplication
public class EurekaProvideApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProvideApplication.class, args);
}
}
server.port=8090
spring.application.name=eureka-provide
#服务注册地址
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka,http://localhost2:1112/eureka
eureka.client.serviceUrl.defaultZone属性将所有的注册中心都写上
@RestController
public class Hellcontroller {
@Autowired
private Registration getServiceId;// 服务注册
@Autowired
private DiscoveryClient client;
@GetMapping(value = "/hello")
public String index() {
List 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的负载均衡策略进行调用,后面会介绍如何使用。
server.port=8092
spring.application.name=eureka-consumer
eureka.client.serviceUrl.defaultZone=http://localhost:1112/eureka
eureka.client.serviceUrl.defaultZone属性只需要写其中一个注册中心即可,即使这个注册中心挂了仍然可以调通
@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具有负载均衡效果
重点:调用的url地址写的是提供者的服务名而不是url地址
@RestController
public class HelloController {
@Resource
RestTemplate restTemplate;
@RequestMapping("/hello")
public String hello(){
return restTemplate.getForEntity ("http://eureka-provide/hello",String.class).getBody ();
}
}