赞
踩
为什么采取SpringCloud Alibaba,处于以下几方面考虑,首先是因为SpringCloud中的一些组件已经宣布停止更新,其次SpringCloud Alibaba提供的这些组件功能更加强大
对于SpringCloud Alibaba的信息,官网上无论是教程还是文字都很清晰
github地址
在本项目中会用到以下组件
首先需要根据SpringBoot的版本选择SpringCloud的版本,我的SpringBoot是2.2.x版本,因此SpringCloud也选择对应版本
在微服务的common服务中添加SpringCloud Alibaba管理
<!--需要与SpringBoot的版本对应,写到DependencyManagement管理版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
注册中心使用的是Nacos,进入官网结合项目进行配置
首先给微服务的common模块引入依赖,因为其他模块是依赖于common模块,因此就完成了所有模块的注册中心的依赖问题
<!--服务注册于发现,在此处依赖就相当于其他依赖于此模块的服务都将有服务注册发现功能-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
然后在properties文件中,或者是yml文件中配置,发现服务的地址和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
需要下载Nacos Server
Nacos Server下载,下载完成启动,默认8848端口
给需要注册的服务中添加完服务地址和端口后,需要在SpringBoot的启动类上加上@EnableDiscoveryClinet
如下
接下来就启动nacos的服务端
访问 http://localhost:8848/nacos
用户名和密码默认都是nacos
登录进去后如下图
现在启动一个已配置好的服务进行测试(如果前面没有配置应用名称需要先配置名称)
spring:
application:
name: mall-coupon
进入Nacos管理页面,查看它的服务管理,可以看见刚刚启动的微服务
下面给所有服务进行注册
如下
通过SpringCloud Feign来进行服务的远程调用,采用的HTTP协议。
首先需要加入open Feign的依赖,谁要调用其他的就给谁加
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在本案例中采用的的是会员微服务调用优惠券服务
首先给mall-member加入上面的依赖
然后在mall-member内编写远程调用接口,并加上@FeignClient注解
//需要调用的微服务名
@FeignClient("mail-coupon")
public interface CouponFeignService {
// 写完整地址需要调用的方法名
@RequestMapping("/coupon/coupon/member/list")
public R memberCoupons();
}
接下来在coupons中编写这个方法(此处为了测试写的假数据)
接下来在会员服务的controller中写一个方法进行测试远程调用,首先先注入写好的远程接口,然后使用。
@Autowired
CouponFeignService couponFeignService;
// 远程调用优惠券服务(此方法测试远程服务)
@RequestMapping("/coupons")
public R testRemoteMethod() {
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("李四");
R memberCoupons = couponFeignService.memberCoupons();
return R.ok().put("member", memberEntity).put("coupons", memberCoupons);
}
然后在会员服务的启动类上加上@EnableFeignClients
开启远程调用功能
@MapperScan("com.wrial.mall.member.dao")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.wrial.mall.member.feign")
@SpringBootApplication
public class MallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(MallMemberApplication.class, args);
}
}
basePackage填的是远程调用接口的位置(我放在了feign包下)
启动会员服务和优惠券服务
访问http://localhost:8000/member/member/coupons接口测试成功
使用Nacos作为配置中心,参照官方demo进行配置
官方DEMO
首先在mall-common中导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
然后给需要配置中心的服务进行配置(我这里给我的每一个微服务都进行配置),一定要配置在bootstrap.properties配置文件中,否则不生效
spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
接下来需要在Controller上加上@RefreshScope
注解,表示可以动态刷新scope
接下来就可以写一些测试的properties然后注入到某个controller中
在application.properties文件中写入自定义属性
member.user.name=lisi
member.user.age=18
在MemberController编写一个测试的方法,并将自定义属性注入,在方法中返回
/**
* 会员
*
* @author wrial
* @email 2806935450@qq.com
* @date 2020-05-01 18:25:01
*/
@RestController
@RefreshScope
@RequestMapping("member/member")
public class MemberController {
@Autowired
private MemberService memberService;
@Autowired
CouponFeignService couponFeignService;
@Value("${member.user.name}")
String userName;
@Value("${member.user.age}")
Integer age;
// 远程调用优惠券服务(此方法测试远程服务)
@RequestMapping("/coupons")
public R testRemoteMethod() {
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("李四");
R memberCoupons = couponFeignService.memberCoupons();
return R.ok().put("member", memberEntity).put("coupons", memberCoupons);
}
// 测试配置中心
@RequestMapping("/name")
public R testConfig(){
return R.ok().put("userName",userName).put("userAge",age);
}
/**
* 列表
*/
@RequestMapping("/list")
//@RequiresPermissions("member:member:list")
public R list(@RequestParam Map<String, Object> params) {
PageUtils page = memberService.queryPage(params);
return R.ok().put("page", page);
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
//@RequiresPermissions("member:member:info")
public R info(@PathVariable("id") Long id) {
MemberEntity member = memberService.getById(id);
return R.ok().put("member", member);
}
/**
* 保存
*/
@RequestMapping("/save")
//@RequiresPermissions("member:member:save")
public R save(@RequestBody MemberEntity member) {
memberService.save(member);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
//@RequiresPermissions("member:member:update")
public R update(@RequestBody MemberEntity member) {
memberService.updateById(member);
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
//@RequiresPermissions("member:member:delete")
public R delete(@RequestBody Long[] ids) {
memberService.removeByIds(Arrays.asList(ids));
return R.ok();
}
}
访问接口
接下来就进入nacos管理台
http://localhost:8848/nacos,添加配置信息
修改配置
访问接口可以发现配置信息已经改变,优先使用配置中心的配置(默认找到配置的应用名.properties文件),比如此处的mall-member.properties
细节
每个微服务创建自己的命名空间(namespace)保证数据隔离,使用分组来区分环境(dev,test,prod等等)保证数据的分组使用。
接下来就可以对每个服务配置多个数据集,为mybatis,datasource,cloud等创建单独的数据集,并添加group为dev
注意:在数据集中不要出现注释信息,否则服务无法启动起来(控制台一直循环)
拆分完毕后对properties文件注释
在bootstrap.properties文件中配置
spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 配置命名空间为coupon
spring.cloud.nacos.config.namespace=b4440c87-67c3-4332-a508-81682ef259cf
# 配置分组为dev
spring.cloud.nacos.config.group=dev
# 这是一个数组,data-id就是nacos配置文件名 group就是分组 refresh默认为false,true就是动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true
spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true
启动服务,访问接口测试
这就是使用nacos完成的配置中心
网关使用的是GateWay,而不是Zuul,Gateway是SpringCloud在zuul后写的,也可以看做是zuul2.0
是基于Spring5,SpringBoot2.0的一个API网关,可以很容易整合服务注册发现还有Hystrix熔断,限流等等
发一个请求给网关,网关将请求路由到指定的服务中去或者指定的地址,不同的路由根据ID来进行区分,需要指定的目的URL,Predict的集合(断言就是一些条件判断),过滤器的集合,只要断言为true就可以进行转发
运行流程就是请求到达网关后,然后查看请求映射是否正确,然后交给指定的处理器,然后请求经过过滤器到达服务,回去的规则也是如此。
完成网关搭建,首先需要新建一个网关服务的Module,并添加上common服务的依赖,并查看SpringBoot和SpringCloud版本和其他模块相同
接下来配置服务的注册和发现(在启动类加上注解,配置discover addr),参考上面步骤
然后再在nacos 控制台创建一个gateway的命名空间和配置文件
因为网关不需要连接数据库,因此把数据源相关的配置都去掉
@EnableDiscoveryClient
//用不到数据库,排除数据源相关的配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(MallGatewayApplication.class, args);
}
}
并在配置文件简单配置几条路由规则
# 可以配多个route
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://qq.com
predicates:
- Query=uri, qq
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: mall-gateway
测试在配置文件配置的路由
参考文章:https://www.cnblogs.com/crazymakercircle/p/11704077.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。