- Eureka: 服务的注册中心(可以是一个集群),是独立的服务
提供者:启动后想Eureka注册自己信息(地址,提供什么服务)
消费者:想Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更更新
心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
2. Eureka demo
1. 引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
2.输写启动类即可,不需要写注册发现功能,spring-cloud依赖就已经帮你做好所有事情
@EnableEurekaServer
@SpringBootApplication
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class);
}
}
3. 启动报错,提示找不到客户端(eureka-client)
Eureka 不能挂,所以要集群,自己是服务端,也可以是客户端
4. 添加客户端配置
server:
port: 8103
eureka:
client:
*# 是一个map类型*
service-url:
defaultZone: http://127.0.0.1:8103/eureka
启动还是会报错,但是没关系,因为需要等自己启动起来才能注册自己,之后不会再报错了,但是注册的服务是UNKNOWN,所以添加服务的名称
spring.application.name=eureka-server
IP无法找到的解决方案:
eureka.instance.prefer-ip-address = true
eureka.instance.ip-address=127.0.0.1
5. 改造之前的提供方(user-service)和调用方(consumer-demo)
由于两个工程都是一样的操作,所以只列举 user-service 工程的改造
5.1. 引入客户端依赖即可,不需要服务端依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client5.2. 启动类添加注解
@EnableEurekaClient
@EnableDiscoveryClient
两个注解都可以,推荐使用 @EnableDiscoveryClient,可以被其他类型的注册中心找到,如 ZooKeeper、Consul、Eureka,Nacos
5.3. 添加配置,完整配置如下
server:
port: 8101
spring:
application:
name: user-service
datasource:
url: jdbc:mysql://localhost:3306/test-basedata
username: root
password: XXXX
driver-class-name: com.mysql.jdbc.Driver
mybatis:
type-aliases-package: com.sharpnew.user.pojo
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8103/eureka
- 修改consumer的controller
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
//注入 discoveryClient 对象
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id) {
//一个服务可以启动多次(同个名称),每次启动的tomcat都是新的实例,所以获取的是实例列表
List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
ServiceInstance info = instances.get(0);
//String url = String.format("http://localhost:8101/user/%s", id);
String url = String.format("http://%s:%s/user/%s", info.getHost(), info.getPort(), id);
System.out.println(url);
User user = restTemplate.getForObject(url, User.class);
return user;
}
}
然后重新刷一下地址,发现访问的结果一样