SpringCloud系列目录:
- 一、SpringCloud简介
- 二、Eureka服务注册与发现
- 三、Eureka注册与发现之Eureka Comsumer
- 四、Eureka、Server Provider集群配置
- 五、Ribbon和OpenFeign
续上片博文,如果在一篇博文中写完Eureka所有的内容,篇幅会过长,这样比较容易漏掉某项配置。还望各位大佬见谅
上篇博文说道,我们目前已经有了商场和商户,目前还缺少一个用户,用户需要通过商场找到商户,并从商户中获取到服务。那接下来我们就新增80用户服务
一、构建项目
先看下module的结构,其中的config可以先不用关注,这个是后续提到的负载均衡的方式
1) 修改pom.xml
<dependencies>
<!--引入Eureka client端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--自定义的服务组件-->
<dependency>
<groupId>com.gaowz</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2)配置application.yml
server:
port: 80
Spring:
application:
#微服务名称 此处的名称即为注册发现中心的名称
name: cloud-consumer-order
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
3)主启动类
@EnableEurekaClient
@SpringBootApplication
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class,args);
}
}
4)业务代码
package com.gao.controller;
import com.gao.domain.CommonResult;
import com.gao.domain.Payment;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* @program: tx_springcloud_02
* @description: 订单的控制层
* @author: gaowz
* @create: 2020-11-16 14:40
**/
@RestController
@RequestMapping("/order")
public class OrderController {
//集群环境下只写服务名称
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment) {
return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class); //写操作
}
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
}
/**
* 使用的是getforentity
* @param id
* @return
*/
@GetMapping("/consumer/payment/getEntity/{id}")
public CommonResult<Payment> getPayment2(@PathVariable("id") Long id) {
ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
if (entity.getStatusCode().is2xxSuccessful()){
return entity.getBody();
}else{
return new CommonResult<>(444,"操作失败");
}
}
}
5)测试
- 首先8001服务先自测看是否有问题,发现是OK的~
- 然后再通过80服务调用8001服务是否依然是OK的,此处远程调用的方式是restTemplate的方式
此处我们发现即是通过80客户端是可以访问到对应的服务的
到这里单体的注册发现,以及服务调用就已经结束了。但是不知道大家有没有发现,到目前为止,我们的Server Provider和 Eureka Server都是都是只有一台。这样的架构行不行呢,说实话其实是没有问题的,但是万一哪天Provdier或者是Eureka Server掉线了,那我们的80客户端还能访问吗?答案是不可以的。
使用集群可以很好的解决上述问题
欢迎各位优秀的工程师批评指正~