Springcloud Alibaba 学习笔记(1)

微服务的拆分与编写

Springcloud Alibaba 学习笔记(1)_第1张图片

  • 项目三板斧
    • 依赖
    • 注解
    • 配置
@Data:次注解包含了Getter Setter RequiredArgsConstructor Tostring EqualsAndHshCode value

@RequiredArgsConstructor:为标记位final的参数生成构造方法
@Builder:
	这里需要注意的是,有builer之前,我们这么写
            UserRegisterDTO userRegisterDTO = new UserRegisterDTO();
        userRegisterDTO.setEmail("dadasda");
        userRegisterDTO.setConfirmPassword("ndksadksa");
        userRegisterDTO.setPassword("dhajksdjk");
	有了builder之后。我们这么写:建造者模式(feign)
    	        UserRegisterDTO.builder()
                .email("dahsjkda")
                .confirmPassword("dnajksjkd")
                .password("aksldkla")
                .build();
	@Slf4j
		之前我们这么写:
    		public static final Logger LOGGER = (Logger) LoggerFactory.getLogger(LombokTest.class);
		后来我们这么写
        	@Slf4j
            
            log.info("dashkdsa")
          
	注意:我们以后的实体类都可以加上
    		@Data
			@AllArgsConstructor
			@NoArgsConstructor
			@Builder
   	这四个注解
    
    @autowired:会标红,
    我们可以使用@RequiredArgsConstructor(onConstructor = @__(@Autowired))来替换,这时候就不会爆红了
    连接
    	http://www.imooc.com/article/287865
  • @resource和@autowired的区别
    @Resource的作用相当于@Autowired,
    @Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了;
    @Resource是JDK自带的注解,而@Autowired是Spring提供的注解;
    @Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
    例如:@Resource可以指定名称@Resource(name=“XXX”)
    @Autowired也可以按照名称进行匹配,但是比较麻烦,要和另外一个注解结合使用:@Autowired @Qualifier(“XXX”)
    @Autowired注解是按类型匹配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。
    这两个注解可以作用在变量上,也可以作用在setter方法上
    如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  • @repository@component@service@controller区别和联系
    @Component,@Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
    @Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
    @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。 (数据库)的bean来使用
    @Controller是spring-mvc的注解,具有将请求进行转发,重定向的功能。
    @Service是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。 用这些注解对应用进行分层之后,就能将请求处理,业务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。
## Schema First
1. 分析业务(流程图、用例图...架构图等等)--> 建模业务,并且确定架构
2. 敲定业务流程(评审)
3. 设计API(我需要哪些API呢)/数据模型(表结构设计|类图|ER图等等)
4. 编写API文档
5. 编写代码---
## API First
1. 分析业务(流程图、用例图...架构图等等)--> 建模业务,并且确定架构
2. 敲定业务流程(评审)
3. 设计API(我需要哪些API呢)/数据模型(表结构设计|类图|ER图等等)
4. 编写代码
5. 编写API文档---灵活运用
  • 怎么调用用户微服务的/users/{userId}?
RestTemplate:

    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        //用http的get方法请求,返回一个对象
        String forObject = restTemplate.getForObject(
                "http://localhost:8080/users/2",
                String.class
        );
        System.out.println(forObject);
    }

    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        //用http的get方法请求,返回一个对象
        String forObject = restTemplate.getForObject(
                "http://localhost:8080/users/{id}",
                String.class,
                2
        );
        System.out.println(forObject);
    }

    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        //用http的get方法请求,返回一个对象
        ResponseEntity<String> forEntity = restTemplate.getForEntity(
                "http://localhost:8080/users/{id}",
                String.class,
                2
        );
        System.out.println(forEntity);
    }
	//可以获取状态码  
	System.out.println(forEntity.getStatusCode());


    //在spring容器中,创建一个对象,类型RestTemplate,名称是restTemplate()
    //
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

	
	
    public class ShareService {
        private final ShareMapper shareMapper;
        private final RestTemplate restTemplate;
        public ShareDTO findById(Integer id) {
            Share share = this.shareMapper.selectByPrimaryKey(id);
            //获取发布人的id
            Integer userId = share.getUserId();
            //怎么调用用户微服务的/users/{userId}?
            UserDTO userDTO = this.restTemplate.getForObject(
                    "http://localhost:8080/users/{id}",
                    UserDTO.class,
                    userId
            );
            //消息的装配
            ShareDTO shareDTO = new ShareDTO();
            BeanUtils.copyProperties(share, shareDTO);
            shareDTO.setWxNickname(userDTO.getWxNickname());

            return shareDTO;
        }
     

  • spring cloud alibaba
    • 版本的兼容性
      Springcloud Alibaba 学习笔记(1)_第2张图片
  • 三板斧
    • 依赖
   <dependencyManagement>

        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Greenwich.SR1version>
                <type>pomtype>
                <scope>importscope>
            dependency>

            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>0.9.0.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
  • 注解:无
  • 配置:无

服务发现

  • nacos
    • 作用
      • 服务发现组件,服务A怎么发现服务B
      • 配置服务器
    • 步骤
      • nacos 配置好
      • 在bin目录下运行 sh startup.sh -m standalone
      • 浏览器访问 http://localhost:8848/nacos
      • 将微服务器注册到微服务器(包括内容,用户中心)
      • 测试一下:内容中心能找到用户中心

Springcloud Alibaba 学习笔记(1)_第3张图片

  • 项目三板斧
    • 依赖
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
  • 注解:无
  • 配置
   cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    #服务名称尽量用-,
    name: user-center

测试代码

  /**
     * @author DARKSIDEinxx
     * @Param
     * @return 用户中心所有实例的地址信息
     * @throws
     * @description 测试:服务发现,证明内容中心总能找到用户中心
     * @updateTime 2022/4/18 21:39
     */

    //springcloud提供的接口
    @Autowired
    private DiscoveryClient discoveryClient;
    @GetMapping("/test2")
    public List<ServiceInstance> setDiscoveryClient() {
        //查询指定服务的所有实例的指定信息
        return this.discoveryClient.getInstances("user-center");

    }


Springcloud Alibaba 学习笔记(1)_第4张图片
使用restTemplate实现微服务的调用:

restTemplate:

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j
public class ShareService {
    private final ShareMapper shareMapper;
    private final RestTemplate restTemplate;
    private final DiscoveryClient discoveryClient;
    public ShareDTO findById(Integer id) {
        Share share = this.shareMapper.selectByPrimaryKey(id);
        //获取发布人的id
        Integer userId = share.getUserId();
        //拿到用户中心的所有实例信息
        List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
        String targetURL = instances.stream()
                //数据变换
                .map(instance -> instance.getUri().toString() + "/users/{id}")
                .findFirst()
                //当instance没有实例的时候,会走到下面的报错
                .orElseThrow(() -> new IllegalArgumentException("当前没有实例"));
        log.info("请求的目标地址是:{}", targetURL);
        //怎么调用用户微服务的/users/{userId}?
        UserDTO userDTO = this.restTemplate.getForObject(
                targetURL,
                UserDTO.class,
                userId
        );
        //消息的装配
        ShareDTO shareDTO = new ShareDTO();
        BeanUtils.copyProperties(share, shareDTO);
        shareDTO.setWxNickname(userDTO.getWxNickname());

        return shareDTO;
    }
}
  • Namespace: 实现隔离

  • Group: 组0.9.0暂时还用不到

  • Service:微服务

  • Cluster:对指定微服务的一个虚拟划分,默认default

  • Instance:微服务实例

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
          #指定namespace
        namespace: 96f205b9-7313-4ed4-984d-4b0cfc51b8ab
        #指定集群名称
        cluster-name: NJ

Springcloud Alibaba 学习笔记(1)_第5张图片
Springcloud Alibaba 学习笔记(1)_第6张图片
Springcloud Alibaba 学习笔记(1)_第7张图片
小D学习的视频是慕课网的大目老师讲解的springcloudAlibaba视频。
keep moving~

你可能感兴趣的:(intellij-idea,java,spring,cloud)