赞
踩
案例Gitee地址:https://gitee.com/tianyinetwork/hei-ma-learn.git
1.搭建 Provider 和 Consumer 服务。
2.使用 RestTemplate 完成远程调用。
3.搭建 Eureka Server 服务。
4.改造 Provider 和 Consumer 称为 Eureka Client。
5.Consumer 服务 通过从 Eureka Server 中抓取 Provider 地址 完成 远程调用
总结:
Eureka的使用:
添加pom依赖,服务端就加server的,客户端就加client的
编辑application.yml配置文件(注意间隔,文档不能保证格式一定正确哈!注意点,一般没问题)
服务器端:
eureka:
instance:
hostname: localhost #主机名
client:
service-url:
# defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和Eureka进行通信
defaultZone: http://${eureka.instance.hostname}:${server.port}}/eureka # eureka服务端地址,将来客户端使用该地址和Eureka进行通信
# 注意:这个不是访问地址哈,这个是用在eureka-Client上的通信地址,让eureka-Client通过这个地址连接到eureka-server
register-with-eureka: false #是否将自己的路径注册到Eureka上。Eureka-Server是不需要的,Eureka的客户端需要
fetch-registry: false #是否需要从Eureka中抓取路径,Eureka-Server不需要的,Eureka-client才需要
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 3000 #检查服务的时间间隔
客户端:
eureka:
instance:
hostname: localhost #主机名
client:
service-url:
defaultZone: http://localhost:8761/eureka #eureka的地址,通过这个地址可以和Eureka-Server端取得通信
register-with-eureka: true #默认就是true ,意思将自己的路径注册到Eureka上
fetch-registry: true #默认就是true , 意思是需要从Eureka上拉取路径
spring:
application:
name: eureka-consumer #设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
#这里省略了两个属性哦
启动类:
@EnableEurekaServer
@EnableDiscoveryClient
这样就完成了!
RestTemplate的使用
需要在Spring容器中注入一个Bean对象
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
在类中注入
@Autowired
private RestTemplate restTemplate;
使用最简单的方法getForObject(String,Class)方法来发起RestFul风格的请求并接收返回对象
String url="http://"+host+":"+port+"/goods/findOne/"+id;
Goods goods = restTemplate.getForObject(url, Goods.class);
//第一个参数是请求地址,第二个参数是接收的返回值类型
通过Eureka获取服务地址
在类中注入DiscoveryClient对象
@Autowired
private DiscoveryClient discoveryClient;
通过DiscoveryClient类的getInstances(“服务名称”)获取服务集合
List<ServiceInstance> instances = discoveryClient.getInstances("EUREKA-PROVIDE");
//为什么是集合?
//因为,我们在实际使用中都是做了高可用处理的,一个服务可能会有多个实例,所以要用集合
需要判断下是否有数据
if(instances==null||instances.size()==0){
//集合没有数据
return null;
}
//为什么要判断null和长度呢?
//我们虽然通过方法获取了服务的服务对象的集合,但是,服务是有可能宕机的呀,所以这里要判断一下服务是否有数据
获取集合中的服务对象
ServiceInstance serviceInstance = instances.get(0);
//因为我们这个案例只有一个服务对象,所以就获取集合的第一个喽!
通过服务对象获取IP地址和端口号信息
tring host = serviceInstance.getHost();
System.out.println("IP地址是:"+host);
int port = serviceInstance.getPort();
System.out.println("服务的端口号是:"+port);
得到了这些信息后,直接使用就行!例如:字符串拼接啥的
String url="http://"+host+":"+port+"/goods/findOne/"+id;
Goods goods = restTemplate.getForObject(url, Goods.class);
Eureka的客户端常用配置:
eureka:
instance:
hostname: localhost # 主机名
prefer-ip-address: true # 将当前实例的ip注册到eureka server 中。默认是false 注册主机名
ip-address: 127.0.0.1 # 设置当前实例的ip
instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 设置web控制台显示的 实例id
lease-renewal-interval-in-seconds: 3 # 每隔3 秒发一次心跳包
lease-expiration-duration-in-seconds: 9 # 如果9秒没有发心跳包,服务器呀,你把我干掉吧~
client:
service-url:
defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
spring:
application:
name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
Eureka高可用
需要配置系统host文件哦!
pom配置文件:
eureka-server1:
server: port: 8761 eureka: instance: hostname: eureka-server1 #主机名 client: service-url: # defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和Eureka进行通信 defaultZone: http://eureka2:8762/eureka # eureka服务端地址,将来客户端使用该地址和Eureka进行通信 # 注意:这个不是访问地址哈,这个是用在eureka-Client上的通信地址,让eureka-Client通过这个地址连接到eureka-server register-with-eureka: true #是否将自己的路径注册到Eureka上。Eureka-Server是不需要的,Eureka的客户端需要 fetch-registry: true #是否需要从Eureka中抓取路径,Eureka-Server不需要的,Eureka-client才需要 server: enable-self-preservation: false #关闭自我保护机制 eviction-interval-timer-in-ms: 3000 #检查服务的时间间隔 spring: application: name: eureka-server1
eureka-server2:
server: port: 8762 eureka: instance: hostname: eureka-server2 #主机名 client: service-url: # defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和Eureka进行通信 defaultZone: http://eureka1:8761/eureka # eureka服务端地址,将来客户端使用该地址和Eureka进行通信 # 注意:这个不是访问地址哈,这个是用在eureka-Client上的通信地址,让eureka-Client通过这个地址连接到eureka-server register-with-eureka: true #是否将自己的路径注册到Eureka上。Eureka-Server是不需要的,Eureka的客户端需要 fetch-registry: true #是否需要从Eureka中抓取路径,Eureka-Server不需要的,Eureka-client才需要 server: enable-self-preservation: false #关闭自我保护机制 eviction-interval-timer-in-ms: 3000 #检查服务的时间间隔 spring: application: name: eureka-server2
附录1:pom.xml:(乱序哦!有点是不能放到一起的,找自己需要的)
<!--SpringBoot的父依赖--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!--JDK 版本--> <java.version>1.8</java.version> <!--spring cloud 版本--> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> </properties> <!--引入Spring Cloud 依赖--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- SpringMVC 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> </dependencies>
附录2:Eureka的全部配置:
Eureka的全部配置
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。