Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。
上图简要描述了Eureka的基本架构,由3个角色组成:
- 1、Eureka Server
提供服务注册和发现
- 2、Service Provider
服务提供方 将自身服务注册到Eureka,从而使服务消费方能够找到
- 3、Service Consumer
服务消费方 从Eureka获取注册服务列表,从而能够消费服务
项目实践
新建三个springboot项目
创建成功之后,修改一下配置文件,删除之前的application.properties 文件,使用application.yml
注册中心:
spring:
application:
name: spring-cloud-eureka-server
server:
port: 8910
eureka:
# instance:
# hostname: peer1
client:
#registerWithEureka 和 fetchRegistry 设置为false,表明自己属于服务中心主体
registerWithEureka: false #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
fetchRegistry: false #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
serviceUrl:
defaultZone: http://127.0.0.1:${server.port}/eureka/
启动类加上注解:
@EnableEurekaServer
生产者:
spring:
application:
name: spring-cloud-eureka-pro
server:
port: 8911
eureka:
# instance:
# hostname: peer2
client:
#registerWithEureka 和 fetchRegistry 设置为false,表明自己属于服务中心主体
registerWithEureka: true #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
fetchRegistry: true #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
serviceUrl:
defaultZone: http://127.0.0.1:8910/eureka/
启动类加上注解:
@EnableEurekaClient
测试接口:
@RestController
public class TestController {
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam String name)
{
return "hi " + name + ",i am from port:" + port;
}
}
消费者(RestTemplate 方式):
spring:
application:
name: spring-cloud-eureka-cus
server:
port: 8912
eureka:
# instance:
# hostname: peer3
client:
#registerWithEureka 和 fetchRegistry 设置为false,表明自己属于服务中心主体
registerWithEureka: true #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
fetchRegistry: true #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
serviceUrl:
defaultZone: http://127.0.0.1:8910/eureka/
启动类加上注解:
@EnableDiscoveryClient
service:
@Service
public class TestService {
@Autowired
RestTemplate restTemplate;
public String hiService(String name)
{
return restTemplate.getForObject("http://spring-cloud-eureka-pro/hi?name=" + name, String.class);
}
}
controller:
@RestController
public class TestController {
@Autowired
TestService testService;
@RequestMapping(value = "/hi")
public String hi(@RequestParam String name) {
return testService.hiService(name);
}
}
消费者(FeignClient方式 ):
pom文件:
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
配置文件不需要改
启动类加上注解:
@EnableDiscoveryClient //开启服务注册客户端
@EnableFeignClients //开启feign client
service:
@FeignClient(name= "spring-cloud-eureka-pro")
public interface FeignService {
@RequestMapping(value = "/hi")
public String hiService(@RequestParam(value = "name") String name);
}
controller:
@Autowired
FeignService feignService;
@RequestMapping(value = "/hi2")
public String hi2(@RequestParam String name) {
return feignService.hiService(name);
}
启动三个项目,访问http://127.0.0.1:8910/,查看注册的实例
直接访问生产者的测试方法
访问消费者
通过端口可以看到消费者访问的是生产的接口
负载均衡
复制一份生产者的代码,修改一下启动端口,其它的不用动,然后启动项目,看一下注册的实例
此时我们的生产者有两个
再次访问消费者能看到会随机的分发到两个生产者所提供的服务上
说明服务中心自动提供了服务均衡负载的功能。如果我们将服务提供者的数量在提高为N个,测试结果一样,请求会自动轮询到每个服务端来处理。