部署eureka注册中心
- ApplicationEureka.java启动类
@SpringBootApplication
@EnableEurekaServer // 开启注册中心
public class ApplicationEureka {
public static void main(String[] args) {
SpringApplication.run(ApplicationEureka.class, args);
}
}
- application.yml配置
############################################################
#
# 微服务
# web访问端口号 约定:7000
#
############################################################
server:
port: 7000
tomcat:
uri-encoding: UTF-8
############################################################
#
# 配置项目信息
#
############################################################
spring:
application:
name: eureka-server
############################################################
#
# eureka项目信息
#
############################################################
eureka:
instance:
# eureka 实例的hostname,可以是hostname,也可以自定义配置hostname
hostname: localhost
client:
# 是否要把当前的eureka server注册到自己
register-with-eureka: false
# 从注册中心获得检索服务实例,server没有必要,直接false即可
# 自己就是注册中心,所以没必要去获得其他服务的实例,然后去调用
fetch-registry: false
# 单实例配置自己的服务地址,高可用集群则配置多个地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
enable-self-preservation: false # 关闭eureka的自我保护功能
eviction-interval-timer-in-ms: 5000 # 清理无效节点的时间,可以缩短为5s,默认60s
- pom.xml相关依赖
<dependencies>
<!-- 引入SpringBoot 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
单机用户服务注册到eureka
- ApplicationUser.java启动类
@SpringBootApplication
@EnableEurekaClient // 开启eureka client 注册到server中
public class ApplicationUser {
public static void main(String[] args) {
SpringApplication.run(ApplicationUser.class, args);
}
}
- 配置RestTemplate
@Configuration
public class CloudConfig {
public CloudConfig() {
}
/**
* 会基于OKHttp3的配置来配置RestTemplate
* @return
*/
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
}
- application.yml配置
############################################################
#
# 用户微服务
# web访问端口号 约定:8001
#
############################################################
server:
port: 8001
tomcat:
uri-encoding: UTF-8
############################################################
#
# 配置项目信息
#
############################################################
spring:
application:
name: user
############################################################
#
# eureka配置信息
#
############################################################
eureka:
server:
hostname: localhost
port: 7000
client:
# 所有的微服务都必须注册到eureka中
register-with-eureka: true
# 从注册中心获得检索服务实例,用户服务需要配置为true
# 用户服务要去获得其他服务的实例,然后去调用
fetch-registry: true
# 注册中心的服务地址
service-url:
defaultZone: http://${eureka.server.hostname}:${eureka.server.port}/eureka/
- pom.xml相关依赖
<dependencies>
<!-- 引入SpringBoot 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.2.2</version>
</dependency>
</dependencies>
- 用户服务调用订单服务的接口
@RestController
@RequestMapping("user")
public class UserController {
// 注入服务发现,可以获得已经注册的服务相关信息
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
/**
* 查询所有订单列表
*
* @return
* @throws Exception
*/
@PostMapping("/findOrderList")
public JSONArray findOrderList() throws Exception {
String serviceId = "ORDER";
List<ServiceInstance> instanceList = discoveryClient.getInstances(serviceId);
ServiceInstance orderSevice = instanceList.get(0);
String url = "http://" + orderSevice.getHost() + ":" + orderSevice.getPort()
+ "/order/findOrderList";
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
HttpEntity<String> formEntity = new HttpEntity<String>(null, headers);
JSONArray responseEntity
= restTemplate.postForObject(url, formEntity, JSONArray.class);
return responseEntity;
}
}
- postman调用效果
单机订单服务注册到eureka
- ApplicationOrder.java启动类
@SpringBootApplication
@EnableEurekaClient // 开启eureka client 注册到server中
public class ApplicationOrder {
public static void main(String[] args) {
SpringApplication.run(ApplicationOrder.class, args);
}
}
- application.yml配置
############################################################
#
# 订单微服务
# web访问端口号 约定:8002
#
############################################################
server:
port: 8002
tomcat:
uri-encoding: UTF-8
############################################################
#
# 配置项目信息
#
############################################################
spring:
application:
name: order
############################################################
#
# eureka配置信息
#
############################################################
eureka:
server:
hostname: localhost
port: 7000
client:
# 所有的微服务都必须注册到eureka中
register-with-eureka: true
# 从注册中心获得检索服务实例,用户服务需要配置为true
# 用户服务要去获得其他服务的实例,然后去调用
fetch-registry: true
# 注册中心的服务地址
service-url:
defaultZone: http://${eureka.server.hostname}:${eureka.server.port}/eureka/
- pom.xml相关依赖
<dependencies>
<!-- 引入SpringBoot 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
</dependencies>
4.对外发布的接口
@RestController
@RequestMapping("order")
public class OrderController {
/**
* 查询所有订单列表
*
* @return
* @throws Exception
*/
@PostMapping("/findOrderList")
public JSONArray findOrderList() throws Exception {
JSONArray orderList = new JSONArray();
JSONObject o1 = new JSONObject();
o1.put("ordNo", "001");
o1.put("ordName", "鼠标");
JSONObject o2 = new JSONObject();
o2.put("ordNo", "002");
o2.put("ordName", "键盘");
orderList.add(o1);
orderList.add(o2);
return orderList;
}
}
- eureka注册中心管理界面效果图
总结
用户服务和订单服务都注册到了eureka上,当用户服务调用订单服务的接口时,会去注册中心获得订单服务的ip地址和端口号,然后拼成完整的服务地址发起http的调用。但是目前来说,以上案例只是针对单机版实现的,唯一的区别就是服务的地址不用写死,而是直接动态从注册中心获取。