SpringCloud 学習ノート 02 - サービスプロバイダーとサービスコンシューマー


序文

本文要记录的大概内容:

以上がマイクロサービスの簡単な理解と理解でしたが、この記事では Spring Cloud について簡単に紹介し、簡単なケースを通して Spring Cloud の簡単な入門学習を行います。

シミュレーションシーン:

快速搭建服务提供者与服务消费者并完成两个服务之间的交互。以电影院购票为例:用户通过电影微服务系统
(服务消费者)购票,电影微服务需要调用用户微服务(服务提供者)查询用户相关信息,账户余额、是否符
合购票标准等。

ここに画像の説明を挿入


提示:以下是本篇文章正文内容,下面案例可供参考

1. Spring Cloud の概要?

SpringCloud は、分散システムの共通パターンを迅速に構築するためのツール セットである SpringBoot に基づいて構築されています。
Spring Cloud を使用して開発されたアプリケーションは、Docker や PaaS へのデプロイに非常に適しているため、クラウド ネイティブ アプリケーションとも呼ばれます。クラウド ネイティブ (Cloud Native) は、クラウド環境のためのソフトウェア アーキテクチャとして理解できます。

2. Spring Cloudの特徴

  1. コンフィギュレーション上/コンフィギュレーション上での規約
  2. さまざまな環境に適しています。PCサーバーや各種クラウド環境(Alibaba Cloud、Tencent Cloud、AWSなど)上で開発・導入可能です。
  3. コンポーネントの複雑さを隠し、宣言型の XML 不要の構成を提供します
  4. すぐに使える、素早いセットアップと起動
  5. 軽量コンポーネント。Spring Cloud によって統合されるコンポーネントのほとんどは比較的軽量であり、Eureka、Zuul などはすべてそれぞれの分野で軽量な実装です。
  6. 豊富なコンポーネントと充実した機能。Spring Cloud は、構成管理、サービス検出、サーキット ブレーカー、マイクロサービス ゲートウェイなどのマイクロサービス アーキテクチャに対して非常に完全なサポートを提供します。
  7. 品揃えはニュートラルかつ豊富です。たとえば、Spring Cloud は、Eureka、ZooKeeper、Consul などを使用したサービス検出をサポートしています。
  8. フレキシブル。Spring Cloud のコンポーネントは分離されており、開発者は必要に応じてテクノロジー オプションを柔軟に選択できます。

3. 実戦の前提条件

1. 技術留保

  • スプリングブーツ

     SpringCloud是基于SpringBoot构建的,因此它延续了SpringBoot的锲约模式以及开发方式
    
  • 開発言語

     SpringCloud是一个基于Java语言的工具套件,所以学习它需要一定的Java基础。Spring Cloud
     支持使用Scala、Groovy等语言进行开发。
    

2. 開発ツール

  • JDK

     JDK版本需要大于等于1.8
    
  • IDE

     使用eclipse、idea、或者Spring Tool Suite均可
    
  • メイビン

     maven的版本应该选择大于3.3.X及以上
    

4. サービスコンシューマとプロバイダを書く

1. サービスプロバイダーを作成する

ユーザー マイクロサービスをサービス プロバイダーとして作成します。機能: 従業員番号を通じて従業員関連情報をクエリします。このサービスは、永続層フレームワークとして Mybatis を使用し、データベースとして Mysql を使用します。

1. プロジェクトをビルドする

Class、yml、xml を手動で記述してプロジェクトを構築するほかに、一般的に使用される方法は次のとおりです。

  • ウェブを通じて

     访问 https://start.spring.io/如下图:可以选择开发语言、版本、填写
     项目的相关信息
    

ここに画像の説明を挿入

  • 開発ツールを使用する (この記事では IDEA を例として取り上げます)
    1. エディターを開き、ナビゲーション バーで [ファイル]、[新規]、[プロジェクト] の順にクリックし、次に示すように Spring Initializr を選択します。
    ここに画像の説明を挿入
    项目属性说明

     Name:更友好的项目名,默认同Artifact保持一致
     Location:项目存储位置
     Language:开发语言
     Type:类型,项目管理工具
     Group:项目组织的唯一标识符
     Artifact:项目名称
     Pacjage name:包名,默认为Group+Artifact,可以手动更改。表示的main/java/目录下的包名
     Project SDK:项目使用的工具包
     Java:语言版本
     Packing:打包方式
    

2. 以下の図に示すように、[次へ] –> を選択し、SpringBoot バージョンを選択し、必要に応じてプロジェクトの依存関係を選択します。選択した依存関係パッケージが右側に表示されます (Spring Boot DevTools は、アプリケーションの高速な再起動、リアルタイムの読み込みと構成を提供します。 Spring Web は Spring MVC を使用して、RESTful アプリケーションや @Controller、@RestController などの一般的なアノテーションを含む Web アプリケーションを構築します。MySQL ドライバーは MySQ 用の JDBC ドライバーと R2DBC ドライバーを提供します。JDBC API は、クライアントの接続方法、データベースのクエリ方法、およびデータベースのクエリ方法を定義するための API を提供します。データベース接続; MyBatis フレームワークはデータ永続性フレームワークです; プロジェクトの作成時に選択されていない依存関係は、プロジェクトで使用されている場合は pom.xml で柔軟に設定できます) 3. [完了] をクリックすると、プロジェクトが作成され、
注意:1. 选择了MyBatis Framework其实就可以不用选JDBC API的依赖了 2. 需要配置好maven,不然依赖包会下载失败
ここに画像の説明を挿入
pom ファイルを開いてエラーを報告します。以下に示すように:
ここに画像の説明を挿入

解決策: バージョン番号を手動で追加します

  • コマンドラインツール Spring Boot CLI 経由

2. 設定ファイルを書き込む

application.properties はプロジェクト作成時にデフォルトで生成されますが、設定ファイルとして yml ファイルを使用することを推奨します (可読性は高いですが、2 つのうちの 1 つしか残せません)。私の設定は次のとおりです。

server:
  port: 8060
  servlet:
    context-path: "/api"
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: ******
    password: ******

3. API、サービス、マッパーを作成する

api接口层:

package com.example.user.api;

import com.example.user.dto.UserDto;
import com.example.user.service.UserService;
import com.example.user.util.ResponseMsg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/userApi")
public class UserApi {
    
    

    @Autowired
    private UserService userServce;

    @GetMapping("/getUserMsgById/{id}")
    public ResponseMsg<UserDto> getUserMsg(@PathVariable("id") Integer id){
    
    
        UserDto user = userServce.getUserMsgById(id);
        return ResponseMsg.success(user);

    }
}

Service层(分为接口和实现类,这里只写实现类):

package com.example.user.service.impl;

import com.example.user.dto.UserDto;
import com.example.user.entity.User;
import com.example.user.mapper.UserMapper;
import com.example.user.service.UserService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    
    

    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDto getUserMsgById(Integer id) {
    
    
        User user = userMapper.queryById(id);
        UserDto userDto = null;
        if(user != null){
    
    
            userDto = new UserDto();
            BeanUtils.copyProperties(user,userDto);
        }
        return userDto;
    }
}

数据层:

package com.example.user.mapper;

import com.example.user.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {
    
    
    User queryById(Integer id);
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.user.mapper.UserMapper">
    <select id="queryById" parameterType="java.lang.Integer" resultType="com.example.user.entity.User">
        select *
        from t_user
        where id = #{id}
    </select>

</mapper>

4. テスト

postman测试截图:

ここに画像の説明を挿入

2. サービスコンシューマを作成します

由于步骤基本一致,前面一样的步骤就省略啦!

設定ファイル

ユーザーサービスと比較すると、ポート番号のみが変更されます

server:
  port: 8061

構成クラス

RestTemplate は、サードパーティの RESTful API インターフェイスにアクセスするためのネットワーク リクエスト フレームワークです。この記事は、ユーザー マイクロサービスをリクエストするために使用されます。構成は次のとおりです。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {
    
    
    @Bean
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }
}

インターフェース層

import com.example.movie.dto.UserDto;
import com.example.movie.util.ResponseMsg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

@RestController
@RequestMapping("/movieApi")
public class MovieApi {
    
    

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getUserMsgById")
    public ResponseMsg<UserDto> getUserMsg(@RequestParam("id") Integer id){
    
    
        UserDto user = new UserDto();
        ResponseMsg<UserDto> userResponse = restTemplate.getForObject("http://localhost:8060/api/userApi/getUserMsgById/"+id,ResponseMsg.class);
        if(userResponse != null){
    
    
            Map<String,Object> map = (Map<String, Object>) userResponse.getEntity();
            for(String key : map.keySet()){
    
    
                if(key.equals("name")){
    
    
                    user.setName((String) map.get(key));
                }else if(key.equals("user_name")){
    
    
                    user.setUser_name((String) map.get(key));
                }else if(key.equals("age")){
    
    
                    user.setAge((Integer) map.get(key));
                }else if(key.equals("balance")){
    
    
                    user.setBalance((Double) map.get(key));
                }
            }
        }
        return ResponseMsg.success(user);

    }
}

アクセステスト

ここに画像の説明を挿入

要約する

提示:这里对文章进行总结:

以上が今日学んだことですが、上図に示した最終テスト結果は、ムービーマイクロサービスがユーザーマイクロサービスのAPIを正常に呼び出せることを示しています。

おすすめ

転載: blog.csdn.net/Shiny_boy_/article/details/125868754