赞
踩
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用 微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布 式应用服务。 依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用 接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
https://github.com/alibaba/spring-cloud-alibaba
SpringCloud 的几大痛点
1.SpringCloud 部分组件停止维护和更新,给开发带来不便;
2.SpringCloud 部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
3.SpringCloud 配置复杂,难以上手,部分配置差别难以区分和合理应用
SpringCloud Alibaba 的优势:
1.阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
2.成套的产品搭配完善的可视化界面给开发运维带来极大的便利
3.搭建简单,学习曲线低。 结合 SpringCloud Alibaba 我们最终的技术搭配方案:
SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)
SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
SpringCloud - Ribbon:负载均衡
SpringCloud - Feign:声明式 HTTP 客户端(调用远程服务)
SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
SpringCloud - Gateway:API 网关(webflux 编程模式)
SpringCloud - Sleuth:调用链监控 SpringCloud Alibaba - Seata:原 Fescar,即分布式事务解决方案
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:
1.5.x 版本适用于 Spring Boot 1.5.x
2.0.x 版本适用于 Spring Boot 2.0.x
2.1.x 版本适用于 Spring Boot 2.1.x
在 common 项目中引入如下。进行统一管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境.
Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html
1.下载地址
https://github.com/alibaba/nacos/releases
下载1.4.3版本的进行开发
2.启动 nacos-server
http://localhost:8848/nacos/
1.首先在common的pom文件中引入Nacos Discovery Starter
<!--nacos依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.在本机微服务中配置nacos地址
coupon,product,member,order,ware依次加入配置
#数据源
spring:
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/gulimail_sms
driver-class-name: com.mysql.jdbc.Driver
cloud:
#nacos地址
nacos:
discovery:
server-addr: 127.0.0.1:8848
3.使用@EnableDiscoveryClient 开启服务注册发现功能
在每个微服务项目的启动类中添加@EnableDiscoveryClient注解
package com.sysg.gulimail.coupon;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;//
/**
* @EnableDiscoveryClient
* 启用服务的注册发现功能
*/
@EnableDiscoveryClient
@SpringBootApplication
public class GulimailCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimailCouponApplication.class, args);
}
}
4.启动应用,观察 nacos 服务列表是否已经注册上服务
为每个服务添加服务名称,其他模块类似
spring:
#服务的名称,用于让nacos知道那个服务正在被调用
application:
name: gulimail-coupon
问题:如果此时我们想从一个微服务1获取数据传输到另一个微服务2,我们应该怎么做?
解答:微服务1先去注册中心nacos去查找想调用的微服务2,在那些服务器上,nacos返回服务器相关信息,然后微服务1通过这些信息调用微服务2,两个微服务之间相互传输数据。
场景gulimail-member从gulimail-coupon获取相关数据
1)首先引入依赖,该微服务才可以去调用其他微服务,获取数据
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
/**
* 这个方法用来测试微服务之间的调用
* member向coupon获取信息
* @return
*/
@RequestMapping("/member/list")
public R memberCoupons(){
CouponEntity entity = new CouponEntity();
entity.setCouponName("满100减10");
List<CouponEntity> list = Arrays.asList(entity);
return R.ok().put("coupons", list);
}
3)在coupon项目的启动类添加相关注解
一:想要远程调用别的服务
package com.sysg.gulimail.member;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* 想要远程调用别的服务
* 1.引入open-feign
* 2.编写一个接口,告诉spring cloud这个接口需要远程服务调用
* 1> 声明接口的每一个方法都是调用那个远程服务的请求
* 3.开启远程调用功能
* 只要服务一起动,就会自动扫描有@feignClient的方法
*/
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.sysg.gulimail.member.feign")
@SpringBootApplication
public class GulimailMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimailMemberApplication.class, args);
}
}
二:在gulimail-member新建一个feign包,新建一个CouponFeignService文件
1.@FeignClient 告诉spring cloud这个接口需要调用远程客户端
2.gulimail-coupon 需要调用客户端的服务名
3.方法里面写需要远程调用的方法
* @RequestMapping的路径一点要是全路径
* 方法就是需要远程调用的方法
package com.sysg.gulimail.member.feign;
import com.sysg.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author sysg
* @FeignClient 告诉spring cloud这个接口需要调用远程客户端
* gulimail-coupon 需要调用客户端的服务名
*/
@FeignClient("gulimail-coupon")
public interface CouponFeignService {
/**
* 需要远程调用的方法名
* 并且@RequestMapping的路径一点要是全路径
* @return
*/
@RequestMapping("/coupon/coupon/member/list")
public R memberCoupons();
}
三:测试远程调用
在MemberController添加方法,调用CouponFeignService的memberCoupons方法
@Autowired
private CouponFeignService couponFeignService;
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
R memberCoupons = couponFeignService.memberCoupons();
return R.ok().put("member",memberEntity).put("coupons",memberCoupons.get("coupons"));
}
在common的pom文件中引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
将coupon和member服务跑起来,访问
http://127.0.0.1:8000/member/member/coupons
1、在common的pom.xml 引入 Nacos Config Starter依赖。
<!--配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.在coupon的应用的 /src/main/resources/bootstrap.properties配置文 件中配置 Nacos Server 地址
#应用名称
spring.application.name=gulimail-coupon
#注册发现中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
在coupon的应用的 /src/main/resources/application.properties配置文 件中配置需求要调用的信息
coupon.user.name=zhangsan
coupon.user.age=18
在CouponController中添加测试方发
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;
@RequestMapping("/test")
public R test (){
return R.ok().put("name",name).put("age",age);
}
访问
127.0.0.1:7000/coupon/coupon/test
进行测试
问题:如果此时想修改name和age的值,只能修改配置文件,然后重新启动项目,如果十台服务器都部署了该项目,就要重启十台服务器,这非常麻烦,有什么简单的方法呢?
解答:可以在nacos客户端添加配置
首先在CouponController添加@RefreshScope注解,此注解作用就是动态刷新配置
@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;
@RequestMapping("/test")
public R test (){
return R.ok().put("name",name).put("age",age);
}
然后再common引入bootstrap依赖
<!--bootstrap依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.1</version>
</dependency>
点击编辑,即可修改配置
输出的内容
{"msg":"success","code":0,"name":"sysg","age":24}
1)引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2)创建一个bootstrap.properties文件
#应用名称
spring.application.name=gulimail-coupon
#注册发现中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
3)给配置中心,默认添加数据集(Data Id) gulimail-conpon.properties data-id()
默认规则:当前应用名+properties
4)给应用名+properties添加任何配置
5)动态刷新配置
@RefreshScope:动态获取并刷新配置
@value(“${配置项的名}”):获取配置
如果配置中心和当前应用都配置了相同的项,优先使用配置中心的配置
1)命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的 配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生 产环境的资源(如配置、服务)隔离等。
首先在命名空间中添加dev,test,prop作为命名空间
然后我们就可以在配置列表里面选择这些命名空间了
在prop生产环境添加类似配置,点击发布
问题:默认会访问public里面的配置信息,怎么样才可以访问prop环境呢?
解答:首先复制prop环境的ID
其次,在coupon的bootstrap.properties添加一处配置即可
#应用名称
spring.application.name=gulimail-coupon
#注册发现中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#配置命名空间
spring.cloud.nacos.config.namespace=7836c7b5-0e40-473d-aa29-633308caa2d9
结论:
1.所以我们可以利用命名空间做环境隔离
2.每一个微服务之间都相互隔离配置,为每一个微服务都添加命名空间,只加载自己的配置
3.我们可以基于环境或者微服务之间进行隔离
2)配置集
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配 置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级 别等配置项。
3)配置集ID
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组 织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有 意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名 规则保证全局唯一性。此命名规则非强制。
4)配置分组
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个 配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置 分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
注:我们可以把application.yml的配置文件提取出来,然后统一让nacos配置中心进行管理
1.将application.yml文件当中的datasource提取出来,如下进行配置,并发布
2.将application.yml文件当中的mybatis提取出来,如下进行配置,并发布
3.将application.yml文件当中的其他配置提取出来,如下进行配置,并发布
配置列表
问题:这些配置文件都是我们所需要使用的,所以我们如何统一启动这些配置文件
解答:在bootstrap.properties文件添加相关配置,即可解决问题。
#拓展配置
#data-id
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
#dev分组
spring.cloud.nacos.config.ext-config[0].group=dev
#动态刷新
spring.cloud.nacos.config.ext-config[0].refresh=true
#data-id
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
#dev分组
spring.cloud.nacos.config.ext-config[1].group=dev
#动态刷新
spring.cloud.nacos.config.ext-config[1].refresh=true
#data-id
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
#dev分组
spring.cloud.nacos.config.ext-config[2].group=dev
#动态刷新
spring.cloud.nacos.config.ext-config[2].refresh=true
测试:
此时我们注释掉coupon的application.yml文件,看添加的配置是否生效。重启coupon项目。
springboot中从配置文件中获取值,都能使用。配置中心有的优先使用配置中心。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。