学习SpringCloud(2)注册中心Eureka及负载均衡

2,499 阅读3分钟

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。

上图简要描述了Eureka的基本架构,由3个角色组成:

  • 1、Eureka Server

提供服务注册和发现

  • 2、Service Provider

服务提供方 将自身服务注册到Eureka,从而使服务消费方能够找到

  • 3、Service Consumer

服务消费方 从Eureka获取注册服务列表,从而能够消费服务

项目实践

新建三个springboot项目

创建成功之后,修改一下配置文件,删除之前的application.properties 文件,使用application.yml

注册中心:

spring:
  application:
    name: spring-cloud-eureka-server
server:
  port: 8910
eureka:
#  instance:
#    hostname: peer1
  client:
    #registerWithEureka 和 fetchRegistry 设置为false,表明自己属于服务中心主体
    registerWithEureka: false #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
    fetchRegistry: false #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
    serviceUrl:
      defaultZone: http://127.0.0.1:${server.port}/eureka/

启动类加上注解:

@EnableEurekaServer

生产者:

spring:
  application:
    name: spring-cloud-eureka-pro
server:
  port: 8911
eureka:
#  instance:
#    hostname: peer2
  client:
    #registerWithEureka 和 fetchRegistry 设置为false,表明自己属于服务中心主体
    registerWithEureka: true #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
    fetchRegistry: true #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
    serviceUrl:
      defaultZone: http://127.0.0.1:8910/eureka/

启动类加上注解:

@EnableEurekaClient

测试接口:

@RestController
public class TestController {

    @Value("${server.port}")
    String port;

    @RequestMapping("/hi")
    public String home(@RequestParam String name)
    {
        return "hi " + name + ",i am from port:" + port;
    }
}

消费者(RestTemplate 方式):

spring:
  application:
    name: spring-cloud-eureka-cus
server:
  port: 8912
eureka:
#  instance:
#    hostname: peer3
  client:
    #registerWithEureka 和 fetchRegistry 设置为false,表明自己属于服务中心主体
    registerWithEureka: true #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
    fetchRegistry: true #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
    serviceUrl:
      defaultZone: http://127.0.0.1:8910/eureka/

启动类加上注解:

@EnableDiscoveryClient

service:

@Service
public class TestService {
    @Autowired
    RestTemplate restTemplate;

    public String hiService(String name)
    {
        return restTemplate.getForObject("http://spring-cloud-eureka-pro/hi?name=" + name, String.class);
    }
}


controller:

@RestController
public class TestController {
    @Autowired
    TestService testService;

    @RequestMapping(value = "/hi")
    public String hi(@RequestParam String name) {
        return testService.hiService(name);
    }
}

消费者(FeignClient方式 ):

pom文件:

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>

    </dependencies>

配置文件不需要改

启动类加上注解:

@EnableDiscoveryClient //开启服务注册客户端
@EnableFeignClients //开启feign client

service:

@FeignClient(name= "spring-cloud-eureka-pro")
public interface FeignService {
    @RequestMapping(value = "/hi")
    public String hiService(@RequestParam(value = "name") String name);
}

controller:

    @Autowired
    FeignService feignService;
    
    @RequestMapping(value = "/hi2")
    public String hi2(@RequestParam String name) {
        return feignService.hiService(name);
    }

启动三个项目,访问http://127.0.0.1:8910/,查看注册的实例

直接访问生产者的测试方法

访问消费者

通过端口可以看到消费者访问的是生产的接口

负载均衡

复制一份生产者的代码,修改一下启动端口,其它的不用动,然后启动项目,看一下注册的实例

此时我们的生产者有两个

再次访问消费者能看到会随机的分发到两个生产者所提供的服务上

说明服务中心自动提供了服务均衡负载的功能。如果我们将服务提供者的数量在提高为N个,测试结果一样,请求会自动轮询到每个服务端来处理。