SpringCloudAlibaba—nacos配置中心+服务通信

唠嗑:今天接着昨天的继续,今天自己搭的时候还是遇到了一些问题,写完会总结一下。

一、服务之间通信
1.通过Ribbon实现
在启动类中定义RestTemplate,使用@LoadBalanced开启负载均衡,Nacos默认整合了Ribbon。

@Bean
    @LoadBalanced //开启负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

在springcloudalibaba-user-server定义一个接口,供其他服务调用
在springcloudalibaba-order-server定义一个接口,调用/user这个接口

@RestController
public class UserController {
    @Autowired
    private IUserService userService;
    @GetMapping("/user/{id}")
    public User getById(@PathVariable Long id){
        //这里可以先用假数据代码代替从数据库查出来的数据,后面会配置连接mysql和集成mybatis-plus。
        User id1 = userService.getOne(new QueryWrapper<User>().eq("id", id));
        return id1;
    }
}
@RestController
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;
    /**
     * 通过Ribbon进行服务通信
     * @param id
     * @return
     */
    @RequestMapping("/order1/{id}")
    public User getById(@PathVariable Long id){
        String url = "http://user-server/user/"+id;
        return restTemplate.getForObject(url,User.class);
    }
}

通过访问http://localhost:1020/order1/1 获取到User数据

测试1.png

2.通过feign
2.1在order-server中引入依赖

        <!--feign依赖包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.2创建一个接口类,存放需要调用的对方服务接口

@FeignClient("user-server") //目标服务名
public interface UserClient {

    //和UserController保持一致
    @GetMapping("/user/{id}")
    User getById(@PathVariable (value="id") Long id);
}

注意@PathVariable (value="id") value不能少,不然要报错。
然后再启动类上开启feign支持
@EnableFeignClients("cn.huangsong.feignclient")

@SpringBootApplication
//@EnableDiscoveryClient注解开启服务发现功能
@EnableDiscoveryClient
//开启Feign支持
@EnableFeignClients("cn.huangsong.feignclient") //扫描接口类包
public class OrgerServerApplication1020 {
    public static void main(String[] args) {
        SpringApplication.run(OrgerServerApplication1020.class);
    }

    @Bean
    @LoadBalanced //开启负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

写个测试接口调用user-sever服务

@RestController
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private UserClient userClient ;

    /**
     * 通过Ribbon进行服务通信
     * @param id
     * @return
     */
    @RequestMapping("/order1/{id}")
    public User getById(@PathVariable Long id){
        String url = "http://user-server/user/"+id;
        return restTemplate.getForObject(url,User.class);
    }

    /**
     * 通过feign进行服务通信 熔断降级暂时没学到那里去。
     * @param id
     * @return
     */
    @RequestMapping("/order2/{id}")
    public User getUserById(@PathVariable Long id){
        return userClient.getById(id);
    }

}

通过访问http://localhost:1020/order2/3获取到User数据

结果图.png

二、nacos配置中心


配置中心.png

点击+新增配置文件


配置文件.png

我这里的配置——>代替了项目中的application.yml


yaml配置.png

项目中操作:把application.yml改成bootstrap.yml
大概的一个流程:cloud项目启动:加载bootstrap.yml配置,根据里面的nacos地址找到配置中心的配置文件
在加载配置中心的配置文件启动项目
在user-server导入需要的报

<!--配置中心依赖包-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

在common导入需要的包 引入持久层框架Mybatis-plus

        <!--mybatis-plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>

创建一张表,生成对应的实体类User

@AllArgsConstructor
@Data
@NoArgsConstructor
@TableName("t_user") //表名
public class User implements Serializable{
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String password;
    private String permission;
}

bootstrap.yml配置

spring:
  profiles:
    active: dev
  application:
    name: user-server #服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: localhost:8848 #配置中心
        file-extension: yaml #配置文件格式
        prefix: application-user #配置前缀 ,默认使用sring.application.name
        group: DEFAULT_GROUP #默认分组
        #namespace: 123456 #命名空间的ID->访问命名空间的配置
        #如何查找配置文件:application-user + dev + yaml=application-user-dev.yaml 正好和Nacos配置的DataId一致

提示:客户端是如何从Nacos中找到配置文件的呢?
spring.cloud.nacos.config.server-addr :配置了Nacos的地址
spring.cloud.nacos.config.file-extension:指定了配置文件的格式为YAML,默认是properties,
spring.cloud.nacos.config.prefix:配置前缀,如果不配置前缀默认会把 服务名即spring.application.name的值作为前缀
spring.cloud.nacos.config.group :分组名,默认是DEFAULT_GROUP对应了Nacos配置中的Group
spring.profiles.active:配置了环境为dev .该配置可以实现多配置多环境管理
根据如上配置,那么config客户端会将:前缀+环境+后缀 拼接成的文件名“application-user-dev.yaml” 去Nacos上查找是否有对应Data ID的配置文件。

启动成功图 端口号是nacos上配置文件中的1030
order-server加载的是项目中的application.yml文件,user-server加载的是nacos上的配置文件


启动成功图.png

user-server和order-server配置文件内容


nacos上的配置文件.png
项目中的配置文件.png

还有一个命名空间这里就不写了,查一下资料就明白了。

易错点:
1.需要加载nacos上的配置文件要把application.yml改成bootstrap.yml
2.引入了持久层框架不要忘记扫描mapper包。启动类上@MapperScan("cn.huangsong.mapper")
3.最重要nacos上的配置文件格式层级一定要写对,不然你会找很久的错的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容