目录
1.4主启动添加@EnableEurekaServer启动服务
3.4主启动类添加@EnableEurekaClient注解
4.4主启动类添加@EnableEurekaClient注解
1.eureka注册中心
1.1创建springcloud-eureka1项目
在父项目上新建一个子模块springcloud-eureka1,端口为9110
父项目版本详见:https://blog.csdn.net/bfss_11/article/details/119056522
涉及文件:
1.2引入依赖eureka-server
组件版本已在父项目中统一管理,子模块中只需要引入对应依赖即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
1.3配置文件
spring:
application:
name: springcloud-eureka1
eureka:
instance:
hostname: localhost #eureka服务端实例名称
client:
register-with-eureka: false #false不向注册中心注册自己
fetch-registry: false #false本身为注册中心,不需要向注册中心拉取服务
service-url:
defaultZone: http://localhost:9110/eureka/
server:
eviction-interval-timer-in-ms: 5000
server:
port: 9110
1.4主启动添加@EnableEurekaServer启动服务
1.5访问eureka注册中心
访问:http://localhost:9110,出现如下内容即服务启动成功
2.eureka集群搭建
2.1修改hosts文件
hosts文件位于:C:\Windows\System32\drivers\etc
127.0.0.1 test1
127.0.0.1 test2
2.2新建第二个eureka服务
新建子模块springcloud-eureka2,端口为9120
建立步骤与上面创建springcloud-eureka1服务相同
2.3修改配置文件
springcloud-eureka1
spring:
application:
name: springcloud-eureka1
eureka:
instance:
#修改部分。eureka服务端实例名称。和hosts中映射名相同
hostname: test1
client:
register-with-eureka: false
fetch-registry: false
service-url:
#修改部分。向另一台eureka服务注册
defaultZone: http://test2:9120/eureka/
server:
eviction-interval-timer-in-ms: 5000
server:
port: 9110
springcloud-eureka2
spring:
application:
name: springcloud-eureka2
eureka:
instance:
#修改部分。eureka服务端实例名称。和hosts中映射名相同
hostname: test2
client:
register-with-eureka: false
fetch-registry: false
service-url:
#修改部分。向另一台eureka服务注册
defaultZone: http://test1:9110/eureka/
server:
eviction-interval-timer-in-ms: 5000
server:
port: 9120
2.4微服务向eureka注册中心注册服务
微服务向eureka集群注册服务时,需要同时向集群中所有eureka注册。即配置eureka.service-url时
service-url:
defaultZone: http://test1:9110/eureka/,http://test2:9120/eureka/
3.生产者
3.1创建3个生产者项目
springcloud-common1、springcloud-common2、springcloud-common3,端口分别为9210、9220、9230
以springcloud-common1为例,涉及文件为:
3.2添加依赖
生产者需要向eureka注册中心注册,添加客户端依赖(版本在父项目中定义)
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
3.3配置文件
applicaton.yml
spring:
profiles:
active:
- one
application:
name: springcloud-common #多个服务应用名相同
eureka:
instance:
instance-id: springcloud-common1 #向eureka中注册的实例名不同
appname: ${spring.application.name}
prefer-ip-address: true
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 5
client:
service-url:
#同时向eureka集群中的所有服务注册
defaultZone: http://test1:9110/eureka/,http://test2:9120/eureka/
application profiles文件中定义三个服务的端口号。分别为one=9210,two=9220,three=9230
application-one.properties
server.port=9210
application-two.properties
server.port=9220
application-three.properties
server.port=9230
3.4主启动类添加@EnableEurekaClient注解
3.5编写controller
返回端口号,便于负载均衡时知道调用了哪一个服务实例
package com.zy.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@CrossOrigin
@RestController
@RequestMapping("/com")
public class CommonController {
@Value("${server.port}")
private Integer port;
@RequestMapping("/get")
public Map<String, Object> get(@RequestBody Map<String, Object> parm) {
parm.put("port", port);
System.out.println(parm);
return parm;
}
}
4.消费者
4.1新建子模块
新建springcloud-comsumer1项目,端口号为9310
涉及文件
4.2添加依赖
pom.xml添加eureka客户端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
4.3配置文件
application.yml
spring:
application:
name: springcloud-consumer
server:
port: 9310
eureka:
instance:
instance-id: springcloud-consumer1
appname: ${spring.application.name}
prefer-ip-address: true
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 5
client:
service-url:
#同时向集群中的所有eureka服务注册
defaultZone: http://test1:9110/eureka/,http://test2:9120/eureka/
4.4主启动类添加@EnableEurekaClient注解
4.5配置restTemplate
在resttemplate上添加@LoadBalanced。使用服务名调用
package com.zy.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
@LoadBalancerClient(value="SPRINGCLOUD-COMMON")
public class RestTemplateConfiguration {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4.6编写controller
通过resttemplate访问服务提供者springcloud-common的接口
package com.zy.controller;
import java.util.Map;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@CrossOrigin
@RestController
@RequestMapping("/consumer")
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
private static String port = null;
@RequestMapping("/get")
public Object get(@RequestBody Map<String, Object> parm) {
ResponseEntity<Map> postForEntity = restTemplate.postForEntity("http://SPRINGCLOUD-COMMON/com/get", parm,
Map.class);
Map<String, Object> body = postForEntity.getBody();
System.out.println(body);
String rstPort = MapUtils.getString(body, "port");
if (StringUtils.equals(port, rstPort)) {
System.err.println("相同:" + port + " ,rstPort:" + rstPort);
}
port = rstPort;
return body;
}
}
4.6启动服务
启动两个eureka服务,三个服务提供者(springcloud-common),服务消费者spirngcloud-consumer1
访问eureka服务,发现生产者、消费者均已注册成功
postman请求消费者接口,成功获取到服务提供者返回的信息,9210说明是调用了springcloud-common1服务
5.扩展使用
服务上下线监控
EurekaInstanceCanceledEvent 服务下线事件。 EurekaInstanceRegisteredEvent 服务注册事件。 EurekaInstanceRenewedEvent 服务续约事件。 EurekaRegistryAvailableEvent Eureka 注册中心启动事件。 EurekaServerStartedEvent Eureka Server 启动事件。 |
package com.zy.eureka;
import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceCanceledEvent;
import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRegisteredEvent;
import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRenewedEvent;
import org.springframework.cloud.netflix.eureka.server.event.EurekaRegistryAvailableEvent;
import org.springframework.cloud.netflix.eureka.server.event.EurekaServerStartedEvent;
import org.springframework.context.event.EventListener;
import com.netflix.appinfo.InstanceInfo;
//@Component
public class EurekaStatusChangeListener {
@EventListener
public void listen(EurekaInstanceCanceledEvent event) {
String serverId = event.getServerId();
System.err.println(serverId + ":" + event.getAppName() + "服务下线");
}
@EventListener
public void listen(EurekaInstanceRegisteredEvent event) {
InstanceInfo instanceInfo = event.getInstanceInfo();
String instanceId = instanceInfo.getInstanceId();
System.err.println(instanceId + ":" + instanceInfo.getAppName() + "服务注册");
}
@EventListener
public void listen(EurekaServerStartedEvent event) {
Object source = event.getSource();
System.err.println(source + "\r\n服务启动");
}
@EventListener
public void listen(EurekaInstanceRenewedEvent event) {
InstanceInfo instanceInfo = event.getInstanceInfo();
String instanceId = instanceInfo.getInstanceId();
System.err.println(instanceId + ":" + instanceInfo.getAppName() + "服务Renewed");
}
@EventListener
public void listen(EurekaRegistryAvailableEvent event) {
Object source = event.getSource();
System.err.println(source + "\r\n服务Available");
}
}