1 版本说明
Spring boot 版本: 2.1.3.RELEASE
Spring Cloud 版本:Greenwich.RELEASE
2 搭建Eureka服务侧
pom依赖如下:
1 24 4.0.0 56 11org.springframework.boot 7spring-boot-starter-parent 82.1.3.RELEASE 910 com.linxi.jia 12eureka-server 130.0.1-SNAPSHOT 14eureka-server 15eureka-server project for Spring Boot 16 1718 21 221.8 19Greenwich.RELEASE 2023 34 3524 27 28org.springframework.cloud 25spring-cloud-starter-netflix-eureka-server 2629 33org.springframework.boot 30spring-boot-starter-test 31test 3236 46 4737 4538 44org.springframework.cloud 39spring-cloud-dependencies 40${spring-cloud.version} 41pom 42import 4348 55 5649 5450 53org.springframework.boot 51spring-boot-maven-plugin 5257 63 6458 62spring-milestones 59Spring Milestones 60https://repo.spring.io/milestone 61
注意:Eureka即是服务端,也是客户端,默认配置是将自己注册到Eureka Server 上,所以在配置客户端信息的时候,也需要配置客户端注册的地址,当然也可以通过配置的形式关闭。
配置文件如下:
Eureka采用高可用部署方式,提供三个节点,三个配置文件只有 Eureka 服务侧的端口信息不一样,其余信息都一样。
修改本地hosts文件,模拟三个不同节点:
application.yml文件:
1 spring: 2 application: 3 name: eureka-server 4 logging: 5 level: 6 root: info 7 server: 8 port: 8761 9 eureka:10 client:11 registerWithEureka: false # 是否自身注册到 Eureka 服务器上面 默认 true12 fetchRegistry: false #是否从 Eureka Server 获取服务提供的信息,默认 true13 serviceUrl:14 defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/ # 当前的eureka版本,服务端同时也是户端,所以必须要将客户端注册到服务端上面去15 instance:16 hostname: node117 # 为注册的 clinet 配置显示的ip值,默认显示的是主机名称18 #perferIpAddress: true19 #instance-id: 0.0.0.0:8888
启动方式: 在应用启动类添加注解 @EnableEurekaServer
3 以client搭建生产者
配置文件:
1 server: 2 port: 8764 3 spring: 4 application: 5 name: client-provider 6 eureka: 7 client: 8 registerWithEureka: true 9 fetchRegistry: true10 serviceUrl:11 # 需要注册到的 eureka 服务端信息12 defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/13 instance:14 hostname: node115 # 为注册的 clinet 配置显示的ip值,默认显示的是主机名称16 #perferIpAddress: true17 #instance-id: 0.0.0.0:888818 logging:19 level:20 root: info
启动:在应用启动类上面添加注解:@EnableEurekaClient
注意:上述配置文件中包含两个配置项,spring.application.name 和 eureka.client.instance.hostname
1. 前者代表当前应用的名称,在消费者进行消费时,是依靠该应用名进行服务消费。比如A应用以n台主机进行部署成集群的方式,如果直接调用ip进行访问,则没有办法实现负载均衡过程。
2. 后者代表一个Eureka Client实例主机名称,比如点击查看8766实例的详细信息时,跳转的域名就是该配置项的值。
跳转截图如下:
Eureka页面
下面截图描述的是注册到当前 Eureka Server 上面的 clinet 端。
下面截图描述的是当前client 注册哪些 Eureka Server 上:
完善生产者功能,向服务中心发布一个服务:
package com.linxi.jia.com.linxi.jia;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;import java.util.Map;/** * Created by 156 on 2019/2/19. */@RestController@RequestMapping("/get")public class TController { @Value("${server.port}") private String port; @GetMapping("/info") public MapgetInfo(){ Map info = new HashMap (); info.put("name","zhangsan"); info.put("age","20"); info.put("port",port); return info; }}
4 以client创建消费者
Ribbon是Neflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端行为,为Ribbon配置服务提供列表后,Ribbon就可以基于某种负载均衡算法,自动的帮助服务消费者去请求。
在生产者基础上新增依赖,并创建 RestTemplate 实例
org.springframework.cloud spring-cloud-starter-ribbon
由于客户端本身已经集成,所以无需引入:
创建 RestTemplate 实例,同时开启负载均衡。
package com.linxi.jia.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;/** * Created by 156 on 2019/2/19. */@Configurationpublic class RibbonCfg { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }}
创建调用实例:
package com.linxi.jia;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import java.util.Map;/** * Created by 156 on 2019/2/19. */@RestController@RequestMapping("/test")public class TController { @Autowired private RestTemplate restTemplate; public Map getInfo(){ // 通过 Eureka 服务端的 应用名称调用,无需考考虑端口和ip return restTemplate.getForObject("http://CLIENT-PROVIDER/get/info",Map.class); }}
修改配置文件,添加启动注解。
消费:http://localhost:8768/test/get
分别消费多次,观察负载均衡情况。