首先需要建立一个spring boot项目
在使用eureka前,先将服务端的jar通过maven导入到项目中
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然后配置服务端在application.yml中
server.port: 80
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:80/eureka/
再通过spring boot的启动类中加上@EnableEnrekaServer服务器端就完成了。
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaServerApplication.class, args);
}
}
访问http://localhost/就可以查看主界面。在没有客户端的情况下Instances currently registered with Eureka中的内容是空的,本人发上来的是有客户端。
新建一个springboot项目作为客户端。
然后配置客户端需要先导入jar,客户端使用client或server都行,但是server的功能要多些。
本项目用于访问建立好后的ribbon,可以得到最后追加内容中的效果。
client
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
这是server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置客户端的基本信息application.properties
spring.application.name=ribbon-consumer
server.port=8080
eureka.client.service-url.defaultZone= http://localhost:80/eureka/
然后在启动类加上@EnableDiscoveryClient。
本客户端使用ribbon负载均匀功能,如果不用负载均匀功能去掉@LoadBalanced标签。
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan("com.自己包名.controller")
public class SpringCloudRibbonApplication {
@Bean
// 负载功能
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudRibbonApplication.class, args);
}
}
然后写上controller来测试一下,启动客户端项目后,在server的Instances currently registered with Eureka中会多一项名为ribbon-consumer的注册信息。
在controller中的resttemplate是用来访问其它服务器的项目名称加上requestmapping地址,后面是返回类型,相当于本服务器在很多人访问的使用,做个判断,让服务器自己把一些请求负载拿给其它服务器,从而降底当前服务器的压力。
@Controller
public class EurekaController {
Logger logger= LoggerFactory.getLogger(getClass());
@Autowired
RestTemplate restTemplate;
@RequestMapping("/index")
@ResponseBody
public Object index() {
logger.info("我是ribbon种的服务正在被访问中……");
// 填写第一个参数为其它Eureka服务器的项目名,也可以自己指定项目名,第二个是返回类型
return restTemplate.getForObject("http://eureka-ribbon/index", String.class);
}
}
为了测试ribbon的功能,再建立的一个客户端服务器(springboot项目)。
客户端导入jar或服务端jar,两者都行
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置application.properties
eureka.client.service-url.defaultZone=http://localhost:80/eureka/
server.port=8090
spring.application.name=eureka-ribbon
启动类和前面一个项目相同。
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan("com.自己报名.controller")
public class SpringCloudEurekaRibbonTestApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaRibbonTestApplication.class, args);
}
}
写上本项目的controller
@Controller
public class EurekaController {
Logger logger= LoggerFactory.getLogger(getClass());
@Autowired
RestTemplate restTemplate;
@RequestMapping("/index")
@ResponseBody
public Object index() {
logger.info("我是eureka-ribbon的服务正在被访问中……");
return "hello!!eurekaAndRibbon!!";
}
}
最后将三个项目全都启动,访问http://localhost/效果如下:
有上面的两排红字是因为eureka进入了保护模式,在保护模式下不会踢出注册了的客户端服务器。
访问http://localhost:8080/index效果如下:
访问第一个客户端服务器的index时自动跳转到第二个客户端服务器的index上了,第一个服务器打印日志如下:
第二个服务器打印日志如下:
其它功能正在学习发现当中。
追加内容:
ribbon开启负载均衡后, 如果想知道运行效果需要建立两个eureka的客户端,并且两个项目中的spring.application.name都为eureka-ribbon,除了端口不一样,端口一样无法启动,两个客户端的功能可以有差异,其它配置和上面相同。
eureka.client.service-url.defaultZone=http://localhost:80/eureka/
server.port=8090
spring.application.name=eureka-ribbon
eureka.client.service-url.defaultZone=http://localhost:80/eureka/
server.port=8091
spring.application.name=eureka-ribbon
两个相同的客户端启动后在eureka的server上可以看到两个相同的客户端。
两个项目都建立地址 /index
然后访问开启ribbon功能的eureka客户端的地址
得到如下结果:
最后再看看日志中的内容:
首先请求localhost:8080/index的日志。
然后是eureka-ribbon项目名称下的日志:
可以看出在不断访问的过程中,会在两个项目中都访问,达到负载均衡。
如果自己觉得想自定义ribbon可以通过@RibbonClient(name="eureka-ribbon",configuration=RibbonConfiguration.class)标签来实现自定义,但是有个要求是不能让@ComponentScan扫描到,放在不能被@ComponentScan扫描到的包下面,不然会重叠出问题。如下面所示:
@Configuration
public class RibbonConfiguration {
@Autowired
IClientConfig setting;
@Bean
public IRule ribbonRule(IClientConfig setting) {
return new RandomRule();
}
}