1) pom.xml 添加以下依赖
artifactId | 说明 | 版本 |
---|---|---|
spring-cloud-starter-alibaba-nacos-discovery | nacos注册中心依赖包 | |
spring-boot-starter-actuator | 监控检查 | |
spring-cloud-starter-alibaba-nacos-config | nacos配置中心依赖支持 | |
spring-cloud-dependencies | Spring Cloud begin | Greenwich.SR2 |
spring-cloud-alibaba-dependencies | Spring Cloud Alibaba begin | 2.1.0.RELEASE |
注意版本问题,spring-boot 、spring-cloud 以及 spring.cloud.alibaba
和 的区别
主要管理版本,对于子类继承同一个父类是很有用的,集中管理依赖版本不添加依赖关系,对于其中定义的版本,子pom不一定要继承父pom所定义的版本。 中的jar直接加到项目中,管理的是依赖关系(如果有父pom,子pom,则子pom中只能被动接受父类的版本);
2) bootstrap.yml
bootstrap.yml和application.yml的区别
a. 使用spring cloud 需要bootstrap.yml在项目加载之前提供server配置信息,作为引导配置。
server: port: 9005 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/myqx?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC username: root password: 1234 application: name: itcast-map cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848
@Autowired private UserInfoService userInfoService; @GetMapping("/get") public List<UserInfo> findAll() { List<UserInfo> result = userInfoService.findAll(); return result; }
这里只暴露了配置和接口,细节上就是CURD的简单接口实现,不必关注,知道调通了就行
相比服务提供者不需要业务依赖项,如mybatis-plus、mysql等,同样需要nacos注册中心依赖包、监控检查、nacos配置中心依赖,需要添加远程调用和Feign依赖。
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <!-- Spring Cloud 版本信息 --> <spring-cloud.version>Greenwich.SR2</spring-cloud.version> <!-- Spring Cloud Alibaba 版本信息 --> <spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version> </properties> <!-- 父工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <!-- Spring Cloud begin--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Spring Cloud end--> <!-- Spring Cloud Alibaba begin--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring.cloud.alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Spring Cloud Alibaba end --> </dependencies> </dependencyManagement> <dependencies> <!--SpringMVC--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--工具包--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <!-- restTemplate 远程调用 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.5</version> </dependency> <!-- nacos注册中心依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 监控检查--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- nacos配置中心依赖支持 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- feign调用 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
2) bootstrap.yml
server: port: 9013 spring: application: name: itcast-nacos cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848
在启动类上需要添加@SpringBootApplication、@EnableDiscoveryClient、@EnableFeignClients
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients // 开启远程调用 public class NacosApplication { public static void main(String[] args) { SpringApplication.run(NacosApplication.class, args); } }
与接口调用者在Controller写接口不一样的是,服务调用者是创建接口类的方式使用@FeignClien注解实现
@FeignClien注解
@FeignClient标签的常用属性如下:
name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
url: url一般用于调试,可以手动指定@FeignClient调用的地址
decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
path: 定义当前FeignClient的统一前缀
1、接口提供方在注册中心。
如果服务提供方已经注册到注册中心了,那么name或者value的值为:服务提供方的服务名称。必须为所有客户端指定一个name或者value
@FeignClient(value=“run-product”,fallback = ProductClientServiceFallBack.class)
2、单独的一个http接口,接口提供方没有注册到注册中心。
@FeignClient(name=“runClient11111”,url=“localhost:8001”)
此处name的值为:调用客户端的名称。
@FeignClient(value = "itcast-map",fallback = UserHystrix.class) public interface UserFegin { @GetMapping("user/get") public List<UserInfo> findAll(); }
@Component public class UserHystrix implements UserFegin { @Override public List<UserInfo> findAll() { return null; } }
@RestController @RequestMapping("/user") public class UserController { @Autowired private RestTemplate restTemplate; @Autowired private UserFegin userFegin; /** * 参数 * @return */ @GetMapping("/test006") public String feignClien() { List<UserInfo> all = userFegin.findAll(); System.out.println(all); return "myqxin"; }
没有搭建nacos的可以参考 windows安装nacos搭建注册中心
在nacos中查看两个服务说明注册成功
请求:http://localhost:9013/user/test006 ,效果如下
使用nacos作为注册中心实现@FeignClient
windows安装nacos搭建注册中心
@FeignClient注解详解