最大感受:
spring cloud无非是将spring boot中的各个工作模块拆分成独立的小spring boot,各个模块之间,不再是通过导包什么的,调用而是通过网路进行各个模块之间的调用
工具一:RestTemplate
在Java代码中发送HTTP请求,可配合spring mvc实现类似于前端的请求转发一样的效果
步骤一:导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
步骤二:编写配置类
config/RestTemplateConfig
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced//实现负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
步骤三:发送HTTP请求
@RestController @Slf4j public class OrderController { public static final String PaymentSrv_URL="http://localhost:8001"; @Resource private RestTemplate restTemplate; @GetMapping("/consumer/pay/add") public ResultData addOrder(PayDTO payDTO){ System.out.println(payDTO); return restTemplate.postForObject(PaymentSrv_URL + "/pay/add",payDTO,ResultData.class); }从“/consumer/pay/add”接收到的数据,再通过restTemplate中的方法发送别的请求
技术栈一: Consul
场景:
微服务所在的IP地址和端口号硬编码到订单微服务中,会存在非常多的问题
(1)如果订单微服务和支付微服务的IP地址或者端口号发生了变化,则支付微服务将变得不可用,需要同步修改订单微服务中调用支付微服务的IP地址和端口号。
(2)如果系统中提供了多个订单微服务和支付微服务,则无法实现微服务的负载均衡功能。
(3)如果系统需要支持更高的并发,需要部署更多的订单微服务和支付微服务,硬编码订单微服务则后续的维护会变得异常复杂。
所以,在微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。
步骤一:导入依赖
<!--SpringCloud consul config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--SpringCloud consul discovery --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
步骤二:编写配置文件
基础知识:
一个项目中通常存在application.yml文件用于项目的参数配置,
但同时还存在bootstrap.yml文件也可以进行参数配置
bootstrap.yml通常用于配置全局的通用的参数,优先级较高
application.yml通常用于配置局部的参数,优先级较低
可共存
plication.yml server: port: 8001 # ==========applicationName + druid-mysql8 driver=================== spring: profiles: //选择要从consul中读取的文件 active: dev # 多环境配置加载内容dev/prod,不写就是默认default配置 # ========================mybatis=================== mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.atguigu.cloud.entities configuration: map-underscore-to-camel-case: true 数据永久化:consul数据持久化_consul配置持久化-优快云博客
bootstrap.yml spring: application: name: cloud-payment-service ####Spring Cloud Consul for Service Discovery cloud: consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name} config: profile-separator: '-' # default value is ",",we update '-' format: YAML # config/cloud-payment-service/data # /cloud-payment-service-dev/data # /cloud-payment-service-prod/data
通过这两个配置文件,可以将这一个子项目,注册到consul中
即原本可以通过localhost/8001访问的项目,取了个别名cloud-payment-service
后可通过别名访问该项目
步骤三:启动服务
cmd命令行: consul agent -dev
在http://localhost:8500/中进行配置
步骤四:调用服务
//从application.yml中获取的参数 @Value("${server.port}") private String port; @GetMapping("/pay/get/info") //从bootstrap.yml中获取consul中的对应文件中的参数 public String getInfoByConsul( @Value("${atguigu.info}") String atguiguInfo ) { return "atguiguInfo:"+atguiguInfo+"\t"+"port:"+port; }
以上总结:
我们将原本配置在项目内的参数配置到了consul注册中心中,
使我们在不同模块中的各个子模块中的参数和模块之间解耦,可以统一配置,
这么麻烦,就是为了实现负载均衡
技术栈二:loadbalancer
步骤一:导入依赖
<!--loadbalancer-->
< dependency >
< groupId >org.springframework.cloud </ groupId >
< artifactId >spring-cloud-starter-loadbalancer </ artifactId >
</ dependency >
步骤二:你不干有的是人干
仔细看会发现cloud-payment-service下是2,
这表明有两个项目(8001,8002 ....端口号不同)在配置时,都以cloud-payment-service为名,注册到consul中
即cloud-payment-service服务有2个端口提供服务
注:loadbalancer默认为轮询算法,即轮流提供服务
所以:
@RestController
public class OrderController
{
//public static final String PaymentSrv_URL = "http://localhost:8001";//先写死,硬编码
public static final String PaymentSrv_URL = "http://cloud-payment-service";//服务注册中心上的微服务名称
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/pay/get/info")
private String getInfoByConsul()
{
return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/info", String.class);
}//当有人发送http://cloud-payment-service请求时,会自动映射为提供服务的端口号
从而实现http://cloud-payment-service服务时,会由不同的项目提供服务,减小服务器压力,即负载均衡
}