写在前面
本文在这篇博文基础上继续进行分析。这里我们需要增加一个新的maven模块my-service-ribbon
,从my-enreka-server
拉取服务注册信息,然后以负载均衡的方式调用myeureka-client
的接口。源码在这里。
1:创建my-service-ribbon
1.1:创建项目
new
->module
,选择Spring Inilializr
以及java8,然后next,录入gav等信息,创建完成后如下图:
1.2:设置parent
<parent>
<groupId>dongshi.daddy</groupId>
<artifactId>my-eureka</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
1.3:引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
1.4:完整pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dongshi.daddy</groupId>
<artifactId>my-service-ribbon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>my-service-ribbon</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>dongshi.daddy</groupId>
<artifactId>my-eureka</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.5:配置文件
server:
port: 8764
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: dongshidaddy-first-ribbon
除了端口号外,使用eureka.client.serviceUrl.defaultZone
设置eureka服务端的地址,从而将自己注册上去,使用spring.application.name
设置自己的名称,该名称会显示在eureka的注册信息中。
1.6:启用相关注解
@EnableEurekaClient
@EnableDiscoveryClient
注解@EnableEurekaClient
启用自己作为eureka的客户端,并向eureka的服务端注册。注解@EnableDiscoveryClient
启用发现者客户端,从eureka服务端读取所有eureka客户端的注册信息。然后注册RestTemplate
的bean到IOC容器中,并通过@LoadBanlanced
注解赋予其使用ribbon进行负载均衡的能力,源码如下:
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
完整代码如下:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class MyServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(MyServiceRibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
1.7:配置service
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
public String hiService(String name) {
return restTemplate.getForObject("http://DONGSHIDADDY-FIRST-EUREKA-CLIENT/hi?name="+name,String.class);
}
}
需要注意DONGSHIDADDY-FIRST-EUREKA-CLIENT
是我的myeureka-client
模块的服务名,要换成你自己的!!!。
1.8:配置controller
@RestController
public class HelloControler {
@Autowired
HelloService helloService;
@GetMapping(value = "/hi")
public String hi(@RequestParam String name) {
return helloService.hiService( name );
}
}
2:测试
2.1:启动my-enreka-server
该服务是eureka的服务端,作为服务的注册中心使用,端口号是8761
。
2.2:启动myeureka-client
第1个实例
修改配置文件设置端口号为8762
,然后启动。
2.3:启动myeureka-client
第2个实例
修改端口号为8763
。注意不能直接启动,需要在Edit Configurations
下添加一个springboot的程序,然后设置名称和主函数,如下图:
启动成功后,查看http://localhost:8761/
可以看到myeureka-client
的实例注册了两个,端口号分别为8762
,8763
。
2.4:启动my-service-ribbon
启动后可以在eureka服务端看到注册的信息,如下图:
2.5:访问接口
如下重复访问,可以在myeureka-client
的两个实例中进行负载调用:
C:\Users\cj>curl http://localhost:8764/hi?name=dongshidaddy
hi dongshidaddy ,i am from port:8763
C:\Users\cj>curl http://localhost:8764/hi?name=dongshidaddy
hi dongshidaddy ,i am from port:8762
C:\Users\cj>curl http://localhost:8764/hi?name=dongshidaddy
hi dongshidaddy ,i am from port:8763
C:\Users\cj>curl http://localhost:8764/hi?name=dongshidaddy
hi dongshidaddy ,i am from port:8762
3:项目架构
此时系统中有1
个eureka的服务端,端口号为8761
,2
个eureka客户端,分别是myeureka-client
,my-service-ribbon
,其中myeureka-client启动2个实例
,端口号分别是8762
和8763
,my-service-ribbon调用myeureka-client提供的服务,最终结构如下图:
注意图中的菱形组件ribbon,因为内部负载实际使用的就是ribbon,所以这里换成ribbon来表示,另外其应该是在my-service-riibon
内部的,这里为了强调单摘出来说明。