Spring Cloud:eureka注册中心

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

        在传统的单体应用中所有的业务都集中在一个服务器中当浏览器发起请求时通过前端请求调用后端接口后端接口调用相应的业务并在前端进行响应整个的调用就是从请求到响应的一条龙服务。所以不存在服务之间的中转也就不存在注册中心。

    但是随着项目越做越大传统的单体项目已经无法满足我们的需求用户数量增加业务功能增多服务器压力变大所以我们需要用微服务思想对项目进行拆分拆分后的每个模块都会再一个服务器上独立的运行。虽然解决了一些单体项目所带来的的诸多瓶颈但是又有一个新的问题产生就是模块与模块之间的调用一个模块的使用可能需要依赖很多模块例如A调用B那么就要在A中写上B的地址也就意味着B的部署位置要稳定不能变如果B要进行集群化部署那么A就需要修改所以耦合度是较高的。引入注册中心它的存在就能解决了这种高耦合度。

组成简介

Eureka由两部分组成服务端和客户端服务端是注册中心用来接收其他服务的注册客户端是java客户端用开注册并实现负载均衡其中客户端根据业务又划分两部分服务提供者和服务消费者。

eureka的使用

官方文档Spring Cloud Netflix

先父项目中导入spring cloud依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>2021.0.1</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

再在新创建的Spring boot模块添加eureka的server依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

需要在主类上添加@EnableEurekaServer的注解标记它是一EurekaServer

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

再进行配置

server:
  port: 8888
eureka:
  client:
      # 由于我们是作为服务端角色所以不需要获取服务端改为false默认为true
    fetch-registry: false  #表示是否从eureka Server 上获取注册信息
    register-with-eureka: false #false表示不向注册中心注册自己。
    # 将eureka服务端指向自己
    service-url:
      defaultZone: http://localhost:8888/eureka

现在可以启动了启动完成后直接输入地址+端口即可访问Eureka的管理后台

现在还没有任何的服务注册到Eureka

再创建一个Spring boot项目并导入Eureka的client依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

修改配置文件

spring:
  application:
    name: userservice

eureka:
  client:
      # 需要指向Eureka服务端地址这样才能进行注册
    service-url:
      defaultZone: http://localhost:8888/eureka

无需在启动类添加注解直接启动就可以了

服务启动之后会每隔一段时间跟Eureka发送一次心跳包这样Eureka就能够感知到我们的服务是否处于正常运行状态

服务的调用

进行服务远程调用我们需要用到RestTemplate来进行这里以图书服务为例

@Service
public class BorrowServiceImpl implements BorrowService{
    @Resource
    BorrowMapper mapper;
    @Override
    public UserBorrowDetail getUserBorrowDetailByUid(int uid) {
        List<Borrow> borrow = mapper.getBorrowsByUid(uid);
        //RestTemplate支持多种方式的远程调用
        RestTemplate template = new RestTemplate();
        //这里通过调用getForObject来请求其他服务并将结果自动进行封装
        //获取User信息
        User user = template.getForObject("http://localhost:8082/user/"+uid, User.class);
        //获取每一本书的详细信息
        List<Book> bookList = borrow
                .stream()
                .map(b -> template.getForObject("http://localhost:8080/book/"+b.getBid(), Book.class))
                .collect(Collectors.toList());
        return new UserBorrowDetail(user, bookList);
    }
}

这个这个服务间的调用需要知道服务的地址但引入并注册eureka之后就可以直接用服务名称替代了

@Service
public class BorrowServiceImpl implements BorrowService {

    @Resource
    BorrowMapper mapper;

    @Resource
    RestTemplate template;

    @Override
    public UserBorrowDetail getUserBorrowDetailByUid(int uid) {
        List<Borrow> borrow = mapper.getBorrowsByUid(uid);

        //这里不用再写IP直接写服务名称userservice
        User user = template.getForObject("http://userservice/user/"+uid, User.class);
        //这里不用再写IP直接写服务名称bookservice
        List<Book> bookList = borrow
                .stream()
                .map(b -> template.getForObject("http://bookservice/book/"+b.getBid(), Book.class))
                .collect(Collectors.toList());
        return new UserBorrowDetail(user, bookList);
    }
}

接着手动将RestTemplate声明为一个Bean然后添加@LoadBalanced注解这样Eureka就会对服务的调用进行自动发现并提供负载均衡

@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    RestTemplate template(){
        return new RestTemplate();
    }
}

负载均衡

同一个服务器实际上是可以注册多个服务实例但是它们的端口不同请求会被均匀地分配到各个服务实例达到负载均衡的目的并且一个服务实例挂了只要存在其他同样的微服务实例在运行那么就不会导致整个微服务不可用极大地保证了安全性。

两种负载均衡策略

  • RandomLoadBalancer - 随机分配策略

  •  RoundRobinLoadBalancer - 轮询分配策略(默认)

指定负载策略

先创建随机分配策略的配置类不用加@Configuration

public class LoadBalancerConfig {
  	//将官方提供的 RandomLoadBalancer 注册为Bean
    @Bean
    public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

为对应的服务指定负载均衡策略直接使用注解即可

@Configuration
@LoadBalancerClient(value = "userservice",      //指定为 userservice 服务只要是调用此服务都会使用我们指定的策略
                    configuration = LoadBalancerConfig.class)   //指定我们刚刚定义好的配置类
public class BeanConfig {
    @Bean
    @LoadBalanced
    RestTemplate template(){
        return new RestTemplate();
    }
}

注册中心高可用

因为用了注册中心之后所有的服务都要经过服务注册中心来进行信息交换所以一旦注册中心出了问题那么会影响到整个系统的稳定性。所以在实际开发中Eureka都是以集群的形式存在。

Eureka集群实际上就是启动多个Eureka实例多个实例之间相互注册相互同步数据共同组成一个 Eureka集群。

修改电脑的hosts文件文件路径是C:\Windows\System32\drivers\etc\hosts,在这个配置文件的末尾加上127.0.0.1 eureka01 eureka02

再修改一下Eureka服务端的配置文件这里需要两个配置文件

server:
  port: 8801
spring:
  application:
    name: eurekaserver
eureka:
  instance:
      # 由于不支持多个localhost的Eureka服务器但是又只有本地测试环境所以就只能自定义主机名称了
      # 主机名称改为eureka01
    hostname: eureka01
  client:

#表示是否从eureka Server 上获取注册信息
    fetch-registry: true 
    # 去掉register-with-eureka选项让Eureka服务器自己注册到其他Eureka服务器这样才能相互启用
    service-url:
        # 注意这里填写其他Eureka服务器的地址不用写自己的
      defaultZone: http://eureka02:8802/eureka

server:
  port: 8802
spring:
  application:
    name: eurekaserver
eureka:
  instance:
    hostname: eureka02
  client:
    fetch-registry: true
    service-url:
      defaultZone: http://eureka01:8801/eureka

对创建的两个配置文件分别添加启动配置直接使用spring.profiles.active指定启用的配置文件

 接着需要对各个微服务配置也进行修改

eureka:
  client:
    service-url:
        # 将两个Eureka的地址都加入这样就算有一个Eureka挂掉也能完成注册
      defaultZone: http://eureka01:8801/eureka, http://eureka02:8802/eureka

这样其他的服务可以在两个eureka实例中都注册了

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring