1 版本说明
Spring boot 版本: 2.1.3.RELEASE
Spring Cloud 版本:Greenwich.RELEASE
2 搭建Eureka服务侧
pom依赖如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.1.3.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.linxi.jia</groupId> 12 <artifactId>eureka-server</artifactId> 13 <version>0.0.1-SNAPSHOT</version> 14 <name>eureka-server</name> 15 <description>eureka-server project for Spring Boot</description> 16 17 <properties> 18 <java.version>1.8</java.version> 19 <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> 20 </properties> 21 22 <dependencies> 23 <dependency> 24 <groupId>org.springframework.cloud</groupId> 25 <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> 26 </dependency> 27 28 <dependency> 29 <groupId>org.springframework.boot</groupId> 30 <artifactId>spring-boot-starter-test</artifactId> 31 <scope>test</scope> 32 </dependency> 33 </dependencies> 34 35 <dependencyManagement> 36 <dependencies> 37 <dependency> 38 <groupId>org.springframework.cloud</groupId> 39 <artifactId>spring-cloud-dependencies</artifactId> 40 <version>${spring-cloud.version}</version> 41 <type>pom</type> 42 <scope>import</scope> 43 </dependency> 44 </dependencies> 45 </dependencyManagement> 46 47 <build> 48 <plugins> 49 <plugin> 50 <groupId>org.springframework.boot</groupId> 51 <artifactId>spring-boot-maven-plugin</artifactId> 52 </plugin> 53 </plugins> 54 </build> 55 56 <repositories> 57 <repository> 58 <id>spring-milestones</id> 59 <name>Spring Milestones</name> 60 <url>https://repo.spring.io/milestone</url> 61 </repository> 62 </repositories> 63 64 </project>
注意: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 服务器上面 默认 true 12 fetchRegistry: false #是否从 Eureka Server 获取服务提供的信息,默认 true 13 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: node1 17 # 为注册的 clinet 配置显示的ip值,默认显示的是主机名称 18 #perferIpAddress: true 19 #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: true 10 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: node1 15 # 为注册的 clinet 配置显示的ip值,默认显示的是主机名称 16 #perferIpAddress: true 17 #instance-id: 0.0.0.0:8888 18 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 Map<String,Object> getInfo(){ Map<String,Object> info = new HashMap<String,Object>(); info.put("name","zhangsan"); info.put("age","20"); info.put("port",port); return info; } }
4 以client创建消费者
Ribbon是Neflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端行为,为Ribbon配置服务提供列表后,Ribbon就可以基于某种负载均衡算法,自动的帮助服务消费者去请求。
在生产者基础上新增依赖,并创建 RestTemplate 实例
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
由于客户端本身已经集成,所以无需引入:
创建 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. */ @Configuration public 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
分别消费多次,观察负载均衡情况。