Eureka レジストリの用途

エウレカレジストリ

スタンドアロンモード

画像-20230306225607857

親プロジェクトの依存関係

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>2021.0.1</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

次に、rurekaプロジェクトを作成します

  • メインクラスを作成する

    注釈を付ける@EnableEurekaServer_

  • ymlファイルを設定する

server:
  port: 8888
eureka:
    # 开启之前需要修改一下客户端设置(虽然是服务端
  client:
      # 由于我们是作为服务端角色,所以不需要获取服务端,改为false,默认为true
        fetch-registry: false
        # 暂时不需要将自己也注册到Eureka
    register-with-eureka: false
    # 将eureka服务端指向自己
    service-url:
      defaultZone: http://localhost:8888/eureka
  • その他のサービスをrerekaに登録する

    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8888/eureka
    

Eureka を取得したので、これに直接クエリを実行して、対応するマイクロサービス アドレスを取得できます。ここでサービス名を直接置き換えることができます。

@Service
public class BorrowServiceImpl implements BorrowService {
    
    

    @Resource
    BorrowMapper mapper;

    @Resource
    RestTemplate template;

    @Override
    public UserBorrowDetail getUserBorrowDetailByUid(int uid) {
    
    
        List<Borrow> borrow = mapper.getBorrowsByUid(uid);

        //这里不用再写IP,直接写服务名称userservice
        User user = template.getForObject("http://userservice/user/"+uid, User.class);
        //这里不用再写IP,直接写服务名称bookservice
        List<Book> bookList = borrow
                .stream()
                .map(b -> template.getForObject("http://bookservice/book/"+b.getBid(), Book.class))
                .collect(Collectors.toList());
        return new UserBorrowDetail(user, bookList);
    }
}

次に、RestTemplate を Bean として手動で宣言し、@LoadBalancedアノテーションを追加して、Eureka が自動的にサービス呼び出しを検出し、負荷分散を提供できるようにします。

@Configuration
public class BeanConfig {
    
    
    @Bean
    @LoadBalanced
    RestTemplate template(){
    
    
        return new RestTemplate();
    }
}

エウレカクラスター

まず、Eureka サーバーの構成ファイルを変更する必要があります。ここでは 2 つの構成ファイルを作成します。

server:
  port: 8801
spring:
  application:
    name: eurekaserver
eureka:
  instance:
      # 由于不支持多个localhost的Eureka服务器,但是又只有本地测试环境,所以就只能自定义主机名称了
      # 主机名称改为eureka01
    hostname: eureka01
  client:
    fetch-registry: false
    # 去掉register-with-eureka选项,让Eureka服务器自己注册到其他Eureka服务器,这样才能相互启用
    service-url:
        # 注意这里填写其他Eureka服务器的地址,不用写自己的
      defaultZone: http://eureka01:8802/eureka

ここでは、カスタム アドレスに変更するため、localhost に戻すには、hosts ファイル内で 172.0.0.1 に解決する必要があります。C:\Windows\System32\drivers\etc\hosts

画像-20230324100050055

画像-20230324102158183

次に、マイクロサービスを変更する必要があります。そうしないと、rureka クラスターを登録できません。

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8801/eureka, http://localhost:8801/eureka

注釈付きのマイクロサービス アドレスもあります

OpenFeign は負荷分散を実装します

公式ドキュメント: https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/

Feign も RestTemplate と同様に HTTP クライアント要求ツールですが、使用する方が便利です。まず依存関係です。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

次に、@EnableFeignClientsスタートアップ クラスにアノテーションを追加します。

@SpringBootApplication
@EnableFeignClients
public class BorrowApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(BorrowApplication.class, args);
    }
}

それでは、他のマイクロサービスによって提供されるインターフェイスを呼び出す必要があるのですが、どうすればよいでしょうか? サービスに対応するインターフェイス クラスを直接作成できます。

@FeignClient("userservice")   //声明为userservice服务的HTTP请求客户端
public interface UserClient {
    
    
}

次に、前の例のように、必要なタイプのメソッドを直接作成します。

RestTemplate template = new RestTemplate();
User user = template.getForObject("http://userservice/user/"+uid, User.class);

次のように直接記述できるようになりました。

@FeignClient("userservice")
public interface UserClient {
    
    

      //路径保证和其他微服务提供的一致即可
    @RequestMapping("/user/{uid}")
    User getUserById(@PathVariable("uid") int uid);  //参数和返回值也保持一致
}

その後、mabatis のようなリクエストを行うことができます

@Resource
UserClient userClient;

@Override
public UserBorrowDetail getUserBorrowDetailByUid(int uid) {
    
    
    List<Borrow> borrow = mapper.getBorrowsByUid(uid);
    
    User user = userClient.getUserById(uid);
    //这里不用再写IP,直接写服务名称bookservice
    List<Book> bookList = borrow
            .stream()
            .map(b -> template.getForObject("http://bookservice/book/"+b.getBid(), Book.class))
            .collect(Collectors.toList());
    return new UserBorrowDetail(user, bookList);
}

おすすめ

転載: blog.csdn.net/m0_57647880/article/details/131114899