Eureka需要搭建服务注册中心,服务的提供者和服务的消费者,服务的提供者把服务注册到Eureka上,服务的消费者从Eureka获取调用的服务地址,使得服务提供者和服务消费者的解耦,一般服务的提供者也同时是服务的消费者。
一 搭建注册中心(Eureka)
1 创建一个spring boot工程,命名为eureka-server,并在pom.xml中引入必要的依赖内容。
2 在main方法上面添加@EnableEurekaServer表示启动一个注册中心提供给其他应用
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
//SpringApplication.run(EurekaServerApplication.class, args);
new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);;
}
}
3 配置文件 application.properties,也可以用yml的文件
eureka.client.register-with-eureka 因为该应用就是注册中心,所以为false,表示不向注册中心注册自己
eureka.client.fetch-registry 由于注册中心的职责就是维护服务实例,它不需要检索服务,所以也为false,完成后启动应用,访问
http://127.0.0.1:1111/
application.properties的配置如下:
server.port=1111
spring.application.name=eureka-server
eureka.instance.hostname=peer1
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/
二 创建服务的提供者
1 创建一个spring boot工程,命名为hello,并在pom.xml中引入必要的依赖内容。
2 Controller编写hello的业务代码,在main方法添加@EnableEurekaClient 注解,表示激活Eureka中的DiscoveryClient实现
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
@RequestMapping("/hello")
public String index( ) {
return "Hello World";
}
}
3 配置文件 application.yml ,defaultZone注册中心的地址,name表示服务的名字,启动hello服务,如下图,在Instances currently registered with Eureka可以看到服务注册的信息。
server:
port: 8082
eureka:
client:
serviceUrl: #注册中心的注册地址
defaultZone: http://peer1:1111/eureka/
spring:
application:
name: hello-service
三 创建服务的消费者
1 创建一个spring boot工程,命名为hello-consumer,并在pom.xml中引入必要的依赖内容。
2 添加RestTemplate类,可以负载均衡的调用服务,@LoadBalanced注解开启客户端的负载均衡,可以看到地址是服务名称,不在是一个具体的ip或者域名的地址,实现客户端和服务端的调用地址的解耦
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient
@SpringBootApplication
public class HelloConsumerApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(HelloConsumerApplication.class, args);
}
}
@RestController
public class HelloConsumerController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("/ribbon-newConsumer")
public String helloNewConsumer( ) {
String ss=restTemplate.getForEntity("http://hello-service/hello", String.class).getBody();
return ss;
}
}
3 配置文件,启动消费者应用,可以看到如下图,应用多了一个HELLO-CONSUMER
server:
port: 9000
eureka:
client:
serviceUrl: #注册中心的注册地址
defaultZone: http://peer1:1111/eureka/
spring:
application:
name: hello-consumer
访问http://127.0.0.1:9000/ribbon-newConsumer 结果如下图
四:把单台的注册中心做成两台高可用模式的注册中心
1 修改配置,第一台配置如下,serviceUrl指向peer2,因为高可用的服务注册中心就是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组互相的服务注册中心,所以eureka.client.register-with-eureka,eureka.client.fetch-registry的值都是true
server.port=1111
spring.application.name=eureka-server
eureka.instance.hostname=peer1
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.serviceUrl.defaultZone=http://peer2:2222/eureka/
第二台配置如下,
serviceUrl指向peer1
server.port=2222
spring.application.name=eureka-server2
eureka.instance.hostname=peer2
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/
2 启动两台服务注册中心,如下图,可以看到两个Eureka的注册中心
3 修改服务方hello和消费方hello-consumer的配置,serviceUrl改为注册中心的集群的配置
eureka:
client:
serviceUrl: #注册中心的注册地址
defaultZone: http://peer1:1111/eureka/,http://peer2:2222/eureka/
总结:
eureka.client.register-with-eureka 表示向注册中心注册自己,如果是单台注册中心,该值是false,如果是多台做高可用,该值是true
eureka.client.fetch-registry 向注册中心检索服务,如果是单台注册中心,该值是false,如果是多台做高可用,该值是true
@EnableEurekaServer表示启动一个注册中心提供给其他应用
@EnableEurekaClient 注解,表示激活Eureka中的DiscoveryClient实现
@LoadBalanced注解开启客户端的负载均衡
对于注册中心eureka.client.serviceUrl.defaultZone; 单台注册中心的时候是自己的注册中心地址,多台高可用的时候是对方的注册中心的地址。
对于服务提供者和消费者 eureka.client.serviceUrl.defaultZone:注册中心的地址,多台高可用的时候是多个注册中心的地址,多个注册中心用逗号分离。