エウレカレジストリ
スタンドアロンモード
親プロジェクトの依存関係
<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
次に、マイクロサービスを変更する必要があります。そうしないと、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);
}