基本结构
-
注册中心:EurekaServer
注册中心提供服务的注册和查询能力。 -
服务提供方:HelloWorldService
服务提供方实现业务逻辑,并将暴露的接口注册到注册中心。 -
服务消费方:DemoConsumer
服务消费方从注册中心查询到服务提供方的相关信息,然后直接访问服务提供方获取相关服务。
EurekaServer
本身也是一个SpringBoot应用,启动后成为服务注册中心,支持多节点集群,本示例使用单节点。
配置文件 application.properties
# 设置spring应用命名,可以自定义,非必要
spring.application.name=eureka-server
# 设置Eureka Server WEB控制台端口,自定义
server.port=8761
#是否将自己注册到Eureka-Server中,默认的为true
eureka.client.registerWithEureka=false
#是否从Eureka-Server中获取服务注册信息,默认为true
eureka.client.fetchRegistry=false
Maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
启动注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
HelloWorldService
实际上这个服务就是一个标准的SpringBoot Web应用,可以部署多个,使用时由注册中心按指定规则进行选择。
配置文件 application.properties
# 对外提供Web服务的端口号
server.port=8762
# 服务注册ID,使用该ID可以从注册中心获取服务实例
spring.application.name=hello-world-service
# 要注册到的注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
Maven依赖
<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-web</artifactId>
</dependency>
服务代码
@RestController
@SpringBootApplication
public class HelloWorldApplication {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String sayHello() {
return "Hello guy!";
}
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
DemoConsumer
这个应用和之前的HelloWorldService
应用在配置和Maven依赖上基本一致,区别就是在代码中增加了从注册中心获取服务实例的部分。
使用DiscoveryClient
获取服务实例
@Autowired
private DiscoveryClient discoveryClient;
/**
* 调用DiscoveryClient获取服务实例列表,取第一个服务实例
* @return
*/
@RequestMapping(value = "/discovery", method = RequestMethod.GET)
public String discoveryHello() {
ServiceInstance si = this.discoveryClient.getInstances(serviceId).get(0);
return sayHello(si);
}
使用LoadBalancerClient
获取服务实例
/**
* ribbon负载均衡器,其中记录了从Eureka Server中获取的所有服务信息。
* 这些服务的信息是IP和端口等。应用名称,域名,主机名等信息。
*/
@Autowired
private LoadBalancerClient loadBalancerClient;
/**
* 调用LoadBanlanceClient获取服务实例,choose策略见配置文件
* @return
*/
@RequestMapping(value = "/balance", method = RequestMethod.GET)
public String balanceHello() {
ServiceInstance si = this.loadBalancerClient.choose(serviceId);
return sayHello(si);
}
ribbon选择策略可以在配置文件中进行配置,注意是按服务进行单独策略配置的
# 设置负载均衡策略
hello-world-service.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
其它
这三个应用由于存在依赖关系,因此启动需要按顺序,首先需要启动EurekaServer,然后启动HelloWorldService注册服务,最后启动DemoConsumer。
源码已上传到码云:com.apollo.microService.demo
网友评论