业务场景:
比如说某个app搞活动,然后用户每日完成多少单奖励啥东西,用户中心页面能够看到自己今日完成多少单。
环境:
1.首先我这里有spring-cloud-parent pom工程
2.spring-cloud-eureka-server Eureka Server 子工程 这里端口我们使用90开头
3.spring-cloud-user-service-consumer 用户服务 (也就是咱们的服务消费者)这里端口我们使用80 开头
4.spring-cloud-order-service-provider 订单服务 (服务提供者) 这里端口我们使用70开头
父工程pom.xml文件需要添加springcloud依赖,主要是为了固定springcloud组件的版本。还有就是spring-boot-starter-web这个依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Greenwich.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-commonsartifactId>
dependency>
dependencies>
也就是我们的spring-cloud-eureka-server 工程。
在pom.xml中添加Eureka Server的依赖坐标
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
dependencies>
然后就是我们需要在主启动类上面添加我们@EnableEurekaServer 注解
我这里使用的application.yml
server: # 服务端口
port: 9090
spring:
application: # 应用名字,eureka 会根据它作为服务id
name: spring-cloud-eureka-server
eureka:
instance:
hostname: localhost
client:
service-url: # eureka server 的地址, 咱们单实例模式就写自己好了
defaultZone: http://localhost:9090/eureka
register-with-eureka: false # 不向eureka server 注册自己
fetch-registry: false # 不向eureka server 获取服务列表
因为不管咱们是服务提供者还是服务调用者,对于Eureka Server来说我们客户端,所以我们这边引入Eureka Client 的依赖坐标
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
dependencies>
我们需要在项目启动类上面加@EnableDiscoveryClient 注解或者@EnableEurekaClient。
server:
port: 7070
spring:
application:
name: spring-cloud-order-service-provider
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9090/eureka
fetch-registry: true
register-with-eureka: true
@RestController
@RequestMapping("/order/data")
public class OrderStatisticServiceController {
@Value("${server.port}")
private Integer port;
/**
* 根据用户id获取今日完单数
* @param id 用户ID
* @return 完单数
*/
@GetMapping("/getTodayFinishOrderNum/{id}")
public Integer getTodayFinishOrderNum(@PathVariable("id") Integer id){
return port;
}
}
本项目中的 pom.xml , 启动类 修改参考1.4节下面的
server:
port: 8080
spring:
application:
name: spring-cloud-user-service-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:9090/eureka
register-with-eureka: true
fetch-registry: true
这里我们要用到RestTemplate 来进行远程调用,需要new RestTemplate对象交给spring
@Configuration
public class RestTemplateConfiguration {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
注意:DiscoveryClient 包是org.springframework.cloud.client.discovery.DiscoveryClient 。
@RestController
@RequestMapping("/user/data")
public class UserCenterController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/getTodayStatistic/{id}")
public Integer getTodayStatistic(@PathVariable("id") Integer id){
// 使用discoveryClient 类能够与eureka server 交互, getInstances 获取注册到eureka server
// 的"spring-cloud-order-service-provider" 实例列表
List<ServiceInstance> instances = discoveryClient.getInstances("spring-cloud-order-service-provider");
// 获取第一个服务信息
ServiceInstance instanceInfo = instances.get(0);
//获取ip
String ip = instanceInfo.getHost();
//获取port
int port = instanceInfo.getPort();
String url ="http://"+ip+":"+port+"/order/data/getTodayFinishOrderNum/"+id;
return restTemplate.getForObject(url, Integer.class);
}
}
我们需要在项目启动类上面加@EnableDiscoveryClient 注解或者@EnableEurekaClient。
spring-cloud-parent 父工程没有改动
我们是在单例Eureka Server 项目基础上改动,然后这里的Eureka Server 使用集群模式,分别是9090 跟9091端口
127.0.0.1 EurekaServerA
127.0.0.1 EurekaServerB
spring:
application:
name: spring-cloud-eureka-server
---
spring:
profiles: u1
eureka:
instance:
hostname: EurekaServerA
client:
service-url:
defaultZone: http://EurekaServerB:9091/eureka
register-with-eureka: true
fetch-registry: true
server:
port: 9090
---
spring:
profiles: u2
eureka:
instance:
hostname: EurekaServerB
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka
register-with-eureka: true
fetch-registry: true
server:
port: 9091
这里是2个Eureka Server组成的集群,然后u1 的往u2 上面注册,u2往u1上面注册
可以在启动配置中 修改active profiles 来指定 使用的配置文件
我们可以在Eureka 控制台中看到两个Eureka Server注册进来了。
server:
port: 7070
spring:
application:
name: spring-cloud-order-service-provider
eureka:
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
fetch-registry: true
register-with-eureka: true
instance:
prefer-ip-address: true # 使用ip注册
#自定义实例显示格式,添加版本号
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
这里就是多加了一个Eureka Server 服务地址,然后修改了实例显示格式。
server:
port: 8080
spring:
application:
name: spring-cloud-user-service-consumer
eureka:
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
register-with-eureka: true
fetch-registry: true
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
这里跟provider一样,也是在application.yml中多加了一个Eureka Server 服务地址,修改了实例显示格式。