1.项目要使用的组件
2.版本对应:
3.在gulimail-common 导入SpringCloudAlibaba的依赖:
<!--springcloudalibaba-->
<!--<dependencyManagement>表示依赖管理,以后在<dependencies>引入alibaba相关依赖就不需要写版本号-->
<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>
4.nacos作为注册中心:
在common引入nacos服务注册发现依赖:
<!--nacos服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
下载nacos服务器并启动:
在yml文件中配置注册中心地址:
#配置nacos服务器注册中心地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
在启动类加@EnableDiscoveryClient注解:服务注册发现
@EnableDiscoveryClient
在yml文件中给服务起名:
#为服务定义自己的名字,这样才能在注册中心看到注册的名字
application:
name: gulimail-coupon
5.注册好两个服务之后测试远程调用,远程调用使用Feign组件
(1)member会员服务想要调用coupon优惠卷服务,需要在会员服务中加入openfeign依赖,这样他就具有了调用其他服务的能力。
<!--远程调用feign组件依赖,具有了调用其他服务的能力-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2) 在优惠卷服务gulimail-coupon的controller中写获取某个会员的所有优惠卷功能:
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
(3)会员服务调用优惠卷服务中查询某个会员所有优惠卷的方法:在会员服务中:
编写一个接口,告诉springcloud这个接口需要调用的远程服务
创建feign包,创建CouponFeignService接口:(接口中需要写@FeignClient("gulimail-coupon")注解,写好需要调用的服务名,需要调用哪个功能,就引入优惠卷服务哪个方法,并将方法的路径写全)
package com.atguigu.gulimail.member.feign;
import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("gulimail-coupon")
public interface CouponFeignService {
@RequestMapping("coupon/coupon/member/list")
public R membercoupons();
}
(4)开启远程调用功能,在会员服务的启动类中加注解
@EnableFeignClients(basePackages = "com.atguigu.gulimail.member.feign")并告诉feign包的路径,服务启动时会自动扫描feign包下的远程调用接口
package com.atguigu.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.需要引入openfeign
* 2.编写一个接口,告诉springcloud这个接口需要调用远程服务
* (1)声明接口的每一个方法都是调用哪个远程服务的哪个请求
* 3.开启远程调用功能@EnableFeignClients
*
* */
@EnableFeignClients(basePackages = "com.atguigu.gulimail.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimailMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimailMemberApplication.class, args);
}
}
(5)在会员controller中调用优惠卷服务:
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private MemberService memberService;
@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"));
}
(6)一开始服务启动失败,原因是springboot与springcloud的版本对应问题:
远程访问成功:访问路径:http://localhost:8000/member/member/coupons
6.nacos作为配置中心:
项目中使用配置中心的优势:如果不使用配置中心,如果项目需要修改配置文件,则又需要重新打包发布,非常的麻烦。使用配置中心后,只需要在配置中心进行修改就行,项目不需要重新打包。
(1)在comon中引入nacos作为配置中心的依赖:
<!--nacos作为配置中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
(2)在coupon服务中创建bootstrap.properties文件:(这是springboot规定的名字,它会优先于application.properties/yml加载读取)
a.获取本地配置文件值的方法:@Value("${user.name}")
application.properties:
c.user.name= dlf
CouponController:
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${c.user.name}")
private String name;
@RequestMapping("/test")
public R test(){
return R.ok().put("name",name);
}
获取成功:
b.进行改造,将配置文件放在配置中心,现在nacos中创建gulimail-coupon.properties,因为之前在bootstrap中进行了配置,服务会自动找到nacos中对应的gulimail-coupon.properties
如果在配置中心中将dlf改为zhangsan,想要在代码中动态的读取到已经改变的值,需要在CouponController:加入一个注解:
@RefreshScope
7.nacos配置中心的命名空间:
a.开发,测试,线上生产环境(发布后)不同环境的配置可能不一样,可以创建不同的命名空间存放不同环境的配置进行隔离:
(1)新建命名空间:
(2)在开发环境命名空间进行配置:
(3)在bootstrap.properties中指定使用dev命名空间的配置:
#当前服务的名字
spring.application.name=gulimail-coupon
#配置中心的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定使用哪个命名空间
spring.cloud.nacos.config.namespace=89700824-406b-49db-b2e1-97b6510a7a3f
(4)测试成功:
b.如果每个服务有超多的配置文件,加上有很多个服务,可以让每一个微服务之间相互隔离配置,每一个微服务都创建自己的命名空间:
c. 配置分组:默认所有的配置集都属于:DEFAULT_DROUP
我们可以自定义组,在bootstrap中指定使用哪个组的配置:
#当前服务的名字
spring.application.name=gulimail-coupon
#配置中心的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定使用哪个命名空间
spring.cloud.nacos.config.namespace=c3849876-f08a-48fc-8d08-e7155ec4dc25
#指定使用哪个组的配置文件(不配置的话时候默认组)
spring.cloud.nacos.config.group=1111
d.在谷粒项目中:每个微服务都创建自己的命名空间,使用配置分组区分环境:dev,test,prop
#当前服务的名字
spring.application.name=gulimail-coupon
#配置中心的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定使用哪个命名空间
spring.cloud.nacos.config.namespace=c3849876-f08a-48fc-8d08-e7155ec4dc25
#指定使用哪个组的配置文件(不配置的话时候默认组)
spring.cloud.nacos.config.group=dev
8.一个服务加载多配置集:(将所有配置全部迁移到nacos中)
随着业务不断壮大,一个服务中可能有非常多的配置,不能将所有的配置都写在一个文件中,这样又多又乱,不易维护。需要将其拆分成不同的配置文件:数据源有关的配置写在一个配置中,mybatisplus框架的·配置写在一个配置中,微服务相关的配置写在一个配置中。
#当前服务的名字
spring.application.name=gulimail-coupon
#配置中心的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定使用哪个命名空间
spring.cloud.nacos.config.namespace=c3849876-f08a-48fc-8d08-e7155ec4dc25
#指定使用哪个组的配置文件(不配置的话时候默认组)
spring.cloud.nacos.config.group=dev
spring.cloud.nacos.config.ext-config[0].data-id=datasouce.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true