1.注册中心原理图
- Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
- 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
- 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
- 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
搭建环境
1.搭建EurekaServer
创建项目模板引入eureka
配置yml
server:
port: 10086 # 端口
spring:
application:
name: eureka-server # 应用名称,会在Eureka中显示
eureka:
client:
service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
defaultZone: http://127.0.0.1:${server.port}/eureka
修改引导类,在类上添加@EnableEurekaServer注解:
@EnableEurekaServer // 声明当前springboot应用是一个eureka服务中心
启动服务,并访问:http://127.0.0.1:10086
2.搭建提供方
参照itcast-eureka,先添加SpringCloud依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后是Eureka客户端:
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置yml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username: root
password: 1024
application:
name: service-provider # 应用名称,注册到eureka后的服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka # EurekaServer地址
instance:
hostname: localhost
# 使用IP注册
preferIpAddress: true
metadata-map:
contextPath: ${server.context-path:}
在引导类上开启Eureka客户端功能
@EnableDiscoveryClient
写接口测试返回数据(略)
启动服务,并访问:http://127.0.0.1:8080
3.搭建服务调用方
同提供方的配置(换一下端口号)
写一个接收的对象类
写一个controller
注入RestTemplate
@Autowired
private RestTemplate restTemplate;
注入DiscoveryClient
@Autowired
private DiscoveryClient discoveryClient; // eureka客户端,可以获取到eureka中服务的信息
@GetMapping("/user")
public List<User> queryUserById(){
// 根据服务名称,获取服务实例。有可能是集群,所以是service实例集合
List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
// 因为只有一个Service-provider。所以获取第一个实例
ServiceInstance instance = instances.get(0);
User[] users = this.restTemplate.getForObject("http://"+instance.getHost()+":"+instance.getPort()+"/user", User[].class);
List<User> userList = Arrays.asList(users);
return userList;
}
启动服务访问,我这里端口是8888
http://127.0.0.1:8888