第四章 SpringCloud-Eureka注册中心

  1. 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-client

5.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
  1. 修改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;
  }
}

然后重新刷一下地址,发现访问的结果一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值