微服务框架SpringCloud(Dalston版)学习 (一):Eureka服务注册与发现
eureka-server
eureka服务端,提供服务的注册与发现,类似于zookeeper
新建spring-boot
工程,pom依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 定义springcloud的版本为Dalston版 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后是启动类,在启动类上加上注解 @EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
//启动方式区别于springboot
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
注册中心配置
默认情况下,注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需要在application.properties进行配置,具体配置信息如下:
# 该服务中心名字
spring.application.name=eureka-server
#端口号
server.port=10000
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
logging.file=${spring.application.name}.log
接下来,打开浏览器,访问127.0.0.1:10000
显然,注册中心还没有任何服务提供者以及消费者:
eureka-client
我们接下来创建提供服务的客户端,并向服务注册中心注册自己。
新建spring-boot
工程,命名为eureka-client
,pom依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 定义springcloud的版本为Dalston版 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后创建一个接口服务,如下:
@RestController
public class EurekaController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/client")
public String client() {
String services = "Services: " + discoveryClient.getServices();
System.out.println(services);
return services;
}
}
接下来是启动类,注意在启动类加上@EnableDiscoveryClient
注解,具体如下:
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
application.properties 配置
spring.application.name=eureka-client
server.port=2000
eureka.client.serviceUrl.defaultZone=http://localhost:10000/eureka/
通过spring.application.name属性,我们可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问。
eureka.client.serviceUrl.defaultZone
属性对应服务注册中心的配置内容,指定服务注册中心的位置。
启动项目,浏览器访问127.0.0.1:10000
如上,证明服务提供方注册成功
eureka-consumer
通过上面两步,我们已经成功地将服务提供者:eureka-client
注册到了Eureka
服务注册中心了,同时我们也通过DiscoveryClient
接口的getServices
获取了当前客户端缓存的所有服务清单,那么接下来我们要学习的就是:如何去消费服务提供者的接口
新建spring-boot
工程,命名为eureka-consumer
,pom依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 定义springcloud的版本为Dalston版 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
配置application.properties,指定服务注册中心
spring.application.name=eureka-consumer
server.port=2100
eureka.client.serviceUrl.defaultZone=http://localhost:10000/eureka/
创建应用主类,注意注解@EnableDiscoveryClient
,和之前服务提供者写法一致
@EnableDiscoveryClient
@SpringBootApplication
public class Application{
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
创建一个接口用来消费eureka-client提供的接口
@RestController
public class ConsumerController{
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
RestTemplate restTemplate;
@GetMapping("/consumer")
public String consumer() {
ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-client");
String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/client";
System.out.println(url);
return restTemplate.getForObject(url, String.class);
}
可以看到,我们注入了LoadBalancerClient
和RestTemplate
,并在/consumer
接口的实现中,先通过loadBalancerClient
的choose
函数来负载均衡的选出一个eureka-client
的服务实例,这个服务实例的基本信息存储在ServiceInstance
中,然后通过这些对象中的信息拼接出访问/client
接口的详细地址,最后再利用RestTemplate
对象实现对服务提供者接口的调用。