spring cloud (三) ——eureka

eureka是springcloud Netflix下的一个组件,现已停止维护

其作用用来做服务发现与治理,可替代的产品也有很多如zookeeper,nacos

 

简单示意图:

 

 

eureka-client的服务都会注册到eureka server中,并且会缓存到客户端,当user-service调用order-service会根据key找到对应的服务

eureka server会通过心跳机制来检测服务是否处于可用状态

eureka提供dashboard来监控客户端服务

 

1、基本使用

1.1、搭建eureka server

使用父子工程来搭建项目:

idea 父子工程项目

eureka server工程的pom文件中引入依赖,注意版本冲突问题,这里选择的是2.2.1,springboot是2.3.1

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

 

 

 在启动类上加上@EnableEurekaServer注解

 

 

 配置文件:这里只配置了端口号和服务名

server.port=8761
spring.application.name=eureka-server-8761

启动,访问:http://localhost:8761/,进入到eureka的控制面板上,目前只有一个自己一个服务,我们再创建user-service和order-service服务。

 

 目录结构:user-service和order-service服务都需要导入eureka-client依赖,注意版本号问题

 

 

 

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

 user-service配置文件:

server.port=9090
spring.application.name=user-service-9090
//指定eureka服务端地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

 order-service配置文件:

server.port=9091
spring.application.name=order-service-9091
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

启动两个服务

 

查看dashboard:

这样一个简单得eureka服务就搭建完成了。

 

1.2、服务调用

使用user-service去访问order-service服务。

user-service:创建一个UserController:

 

 

 

@RestController
@RequestMapping("user")
public class UserController {

@Autowired
private RestTemplate restTemplate;
@LoadBalanced
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}

@GetMapping("/user/{userId}")
public String getOrderByUser(@PathVariable("userId") Long userId){
return restTemplate.getForObject("http://order-service/order/list",String.class);
}
}

order-service:创建一个OrderController:

@RestController
@RequestMapping("order")
public class OrderController {

    @GetMapping("/list")
    public String listOrders(){
        System.out.println("——————被调用了——————");
        return "order-service 被调用了 " + LocalDateTime.now();
    }
}

测试:访问http://localhost:9090/user/user/1

页面结果

order-service 被调用了 2020-07-15T21:30:57.533

这样就完成了eureka服务调用。

 

注意点:

1、eureka-server的启动类上加上@EnableEurekaServer注解

2、发送restTemplate请求注意加上@LoadBalanced

3、客户端导入eureka-client,服务端导入eureka-server ,注意版本号问题

 

1.3、eureka结合ribbon使用

在eureka中已经整合了ribbon,所以可以直接使用ribbon的功能,ribbon的使用spring cloud (一) ——ribbon

在不使用eureka前,在ribbon中,我们在user-service中的配置

文件中加入需要访问的服务列表,例如这样:

# 配置指定服务的提供者的地址列表
orderservice.ribbon.listOfServers=\
  localhost:8080,localhost:8081,localhost:8082

而这里我们就可以从eureka的服务中心去获取,然后缓存,所以我们无需写这一行的配置,上面的案例已经实现

了eureka和ribbon的整合,只不过order-service只启动了一个服务,如果我们启动多个order-service服务,那么@LoadBalanced

注解的作用就会很明显了。

测试:

当我们访问5次时,发现9091访问了2次,发现9092访问了2次,发现9093访问了1次

ribbon默认的负载策略是轮询策略。

2、原理及源码解析

posted @ 2020-08-12 22:58  来一杯可乐  阅读(235)  评论(0编辑  收藏  举报